source

Python으로 작성된 CSV 파일은 각 행 사이에 공백 행이 있습니다.

factcode 2022. 9. 17. 09:46
반응형

Python으로 작성된 CSV 파일은 각 행 사이에 공백 행이 있습니다.

import csv

with open('thefile.csv', 'rb') as f:
  data = list(csv.reader(f))
  import collections
  counter = collections.defaultdict(int)

  for row in data:
        counter[row[10]] += 1


with open('/pythonwork/thefile_subset11.csv', 'w') as outfile:
    writer = csv.writer(outfile)
    for row in data:
        if counter[row[10]] >= 504:
           writer.writerow(row)

이 코드는 다음과 같습니다.thefile.csv변경 및 결과 쓰기thefile_subset1.

다만, Microsoft Excel 로 CSV 를 열면, 각 레코드 뒤에 여분의 공백 행이 표시됩니다.

여백을 남기지 않도록 하는 방법이 있나요?

csv.writer모듈이 행의 끝과 쓰기를 직접 제어합니다.\r\n파일에 직접 입력합니다.Python 3에서 파일은 다음 매개 변수를 사용하여 번역되지 않은 텍스트 모드로 열어야 합니다.'w', newline=''(빈 문자열) 그렇지 않으면 씁니다.\r\r\nWindows 에서는, 디폴트 텍스트모드로 각 텍스트가 변환됩니다.\n안으로\r\n.

#!python3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)

Python 2에서 바이너리 모드를 사용하여outfile모드와 함께'wb'대신'w'Windows 의 줄 바꿈 변환을 방지합니다.Python 2는 유니코드에도 문제가 있어 ASCII가 아닌 텍스트를 쓰려면 다른 해결 방법이 필요합니다.아래 Python 2 링크 및UnicodeReader그리고.UnicodeWriter예를 들어 Python 2의 CSV에 Unicode 문자열을 쓸 필요가 있는 경우 또는 서드파티 unicodecsv 모듈을 조사할 필요가 있는 경우:

#!python2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
    writer = csv.writer(outfile)

문서 링크

바이너리 모드 "wb"에서 파일을 여는 것은 Python 3+에서 작동하지 않습니다.또는 데이터를 쓰기 전에 바이너리로 변환해야 합니다.그건 그냥 귀찮아.

대신 텍스트 모드로 유지하되 줄바꿈을 비워 두어야 합니다.다음과 같은 경우:

with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:

간단한 답변은 CSV 파일은 입력이든 출력이든 항상 바이너리 모드로 열어야 합니다.Windows 에서는 행의 종료에 문제가 있기 때문입니다.특히 출력에서는 csv 모듈이 씁니다.\r\n(표준 CSV 행 터미네이터) 다음으로 (텍스트모드에서) 실행 시 에 의해\n타고\r\n(Windows 표준 회선 터미네이터)의 결과는 다음과 같습니다.\r\r\n.

만지작거리다lineterminator해결책이 아닙니다.

주의: Windows 시스템에서 추가 행이 추가되어 있기 때문에 이 솔루션은 권장되지 않는 것 같습니다.python 문서에 기술된 바와 같이:

csvfile이 파일개체일 경우 차이가 있는 플랫폼에서는 'b' 플래그를 사용하여 열어야 합니다.

Windows는 이러한 플랫폼 중 하나입니다.아래 설명과 같이 회선 터미네이터를 변경하면 문제가 해결되었을 수 있지만 파일을 바이너리 모드로 열면 문제를 완전히 방지할 수 있습니다.이 솔루션이 더 "고급"이라고 말할 수 있습니다.이 경우, 회선 터미네이터를 「피들링」하면, 시스템간에 휴대할 수 없는 코드가 생깁니다.유닉스 시스템에서 바이너리 모드로 파일을 열면, 시스템간에 호환성이 있는 코드가 생깁니다.

Python Docs에서:

Windows 에서는, 모드에 「b」를 부가하면 파일이 바이너리 모드로 열리기 때문에, 「rb」, 「wb」, 「r+b」등의 모드도 있습니다.Windows의 Python은 텍스트 파일과 바이너리 파일을 구분합니다.텍스트 파일의 행 끝 문자는 데이터를 읽거나 쓸 때 자동으로 약간 변경됩니다.ASCII 텍스트 파일에서는 이러한 파일 데이터의 백그라운드 수정이 가능하지만 JPEG 또는 EXE 파일과 같은 바이너리 데이터가 손상됩니다.이러한 파일을 읽고 쓸 때는 바이너리 모드를 사용할 수 있도록 주의하십시오.Unix 에서는, 모드에 「b」를 부가하는 것도 문제 없습니다.따라서, 모든 바이너리 파일에 대해서 플랫폼에 의존하지 않고 사용할 수 있습니다.

오리지널:

csv.writer의 옵션 파라미터의 일부로서 여분의 공백 행이 표시되는 경우는, lineterminator(여기에서는 info)를 변경할 필요가 있습니다.아래 예시는 python 페이지 csv docs에서 수정한 것입니다."n"에서 "n"으로 변경합니다.이것은 단지 그 문제에 대한 암울한 생각일 뿐이기 때문에 이것이 먹힐 수도 있고 안 먹힐 수도 있지만, 내가 추측하는 최선의 방법이다.

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n')
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

다른 많은 대답들은 원래 질문 이후 10년 동안 시대에 뒤떨어졌다.Python3의 경우, 정답은 설명서에 나와 있습니다.

일 경우 csvfile로 .newline=''

각주에 자세히 설명되어 있습니다.

newline="을 지정하지 않으면 따옴표로 묶인 필드 내에 포함된 새 행이 올바르게 해석되지 않으며, \r\n 행 쓰기를 사용하는 플랫폼에서는 \r이 추가됩니다.CSV 모듈은 자체(범용) 뉴라인 처리를 수행하므로 항상 newline='을 지정하는 것이 안전합니다.

CSV 파일에 데이터를 쓰려면 다음 방법을 사용합니다.

open('outputFile.csv', 'a',newline='')

돼요.newline='' open 삭제:

def writePhoneSpecsToCSV():
    rowData=["field1", "field2"]
    with open('outputFile.csv', 'a',newline='') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow(rowData)

그러면 추가 행을 생성하지 않고 CSV 행이 기록됩니다.

처음에 같은 문제가 발생했기 때문에 python 3에 대한 답변을 w.r.t.로 씁니다.

는 arduino를 사용해서 있었습니다.PySerial파일에 .csv 파일로 씁니다. 때마다 .'\r\n'뉴라인

경우에는 ★★★★★★★★★★★★★★★★★★★★★★★★★.newline=''이치노 ', 하다, 하다'와 같은 오류입니다.

with open('op.csv', 'a',newline=' ') as csv_file:

ValueError: illegal newline value: ''

그래서 그들은 여기서 줄바꿈을 생략하는 것을 받아들이지 않는 것 같았다.

여기서만 정답을 보고 라이터 오브젝트에 줄 터미네이터를 언급했습니다.

writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')

새 줄을 건너뛰는 데 효과가 있었어요

with open(destPath+'\\'+csvXML, 'a+') as csvFile:
    writer = csv.writer(csvFile, delimiter=';', lineterminator='\r')
    writer.writerows(xmlList)

"limeterminator='\r'"는 두 행 사이에 빈 행을 포함하지 않고 다음 행으로 전달할 수 있습니다.

이 답변에서 인용하자면, 가장 깔끔한 해결책은 다음과 같이 사용하는 것 같습니다.io.TextIOWrapper저는 이 문제를 다음과 같이 해결했습니다.

from io import TextIOWrapper

...

with open(filename, 'wb') as csvfile, TextIOWrapper(csvfile, encoding='utf-8', newline='') as wrapper:
    csvwriter = csv.writer(wrapper)
    for data_row in data:
        csvwriter.writerow(data_row)

파이썬 2의 약칭입니다.가지기 문장의 환, 든, 모, 모, 모, 모, 모, to, to, to, to, to, to, to, to, to, to, to, to, to, to, to, an, an, an, to, an, an, an, an, an, an, an, an, an, , anif 삭제:

if sys.version_info < (3,):
    # Python 2 way of handling CSVs
else:
    # The above logic

나는 writerow를 사용했다.

def write_csv(writer, var1, var2, var3, var4):
    """
    write four variables into a csv file
    """
    writer.writerow([var1, var2, var3, var4])      
        
numbers=set([1,2,3,4,5,6,7,2,4,6,8,10,12,14,16])
rules = list(permutations(numbers, 4))
#print(rules)
selection=[]
with open("count.csv", 'w',newline='') as csvfile:
    writer = csv.writer(csvfile)

    for rule in rules:
        number1,number2,number3,number4=rule
        if ((number1+number2+number3+number4)%5==0):
            #print(rule)
            selection.append(rule)
            write_csv(writer,number1,number2,number3,number4)

Python 3을 사용하는 경우 코덱모듈을 사용하면 빈 행을 방지할 수 있습니다.설명서에서 설명한 바와 같이 파일은 바이너리 모드로 열리기 때문에 새 행 kwarg를 변경할 필요가 없습니다.최근에 같은 문제에 부딪혔는데, 이 문제가 제게는 효과가 있었습니다.

with codecs.open( csv_file,  mode='w', encoding='utf-8') as out_csv:
     csv_out_file = csv.DictWriter(out_csv)

언급URL : https://stackoverflow.com/questions/3348460/csv-file-written-with-python-has-blank-lines-between-each-row

반응형