본문 바로가기
Python/Python FAQ

Python으로 작성된 CSV 파일은 각 행 사이에 빈 줄이 있습니다., CSV file written with Python has blank lines between each row

by 베타코드 2023. 7. 24.
반응형

질문


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 파일을 열면 각 레코드 뒤에 추가로 빈 줄이 있습니다!

추가로 빈 줄이 생성되지 않도록 하는 방법이 있을까요?


답변


The csv.writer 모듈은 직접 줄 끝을 제어하고 파일에 \r\n을 직접 작성합니다. Python 3에서는 파일을 번역되지 않은 텍스트 모드로 열어야 합니다. 매개변수는 'w', newline='' (빈 문자열)이어야 합니다. 그렇지 않으면 기본 텍스트 모드에서 각 \n\r\n으로 번역하므로 Windows에서 \r\r\n을 작성합니다.

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

Path 모듈을 사용하는 경우:

from pathlib import Path
import csv

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

StringIO 모듈을 사용하여 메모리 내 결과를 작성하는 경우 결과 문자열에는 번역된 줄 종결자가 포함됩니다:

from io import StringIO
import csv

s = StringIO()
writer = csv.writer(s)
writer.writerow([1,2,3])
print(repr(s.getvalue()))  # '1,2,3\r\n'   (Windows 결과)

나중에 해당 문자열을 파일에 작성하는 경우 newline=''을 사용하는 것을 기억하세요:

# 내장 open()
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as f:
    f.write(s.getvalue())

# Path의 open()
with Path('/pythonwork/thefile_subset11.csv').open('w', newline='') as f:
    f.write(s.getvalue())

# Path의 write_text()는 Python 3.10에 newline 매개변수가 추가되었습니다.
Path('/pythonwork/thefile_subset11.csv').write_text(s.getvalue(), newline='')

Python 2에서는 이스케이프 시퀀스 변환을 방지하기 위해 outfile을 이진 모드로 열기 위해 'wb' 대신 'w' 모드를 사용합니다. Python 2는 유니코드에 문제가 있으며 비 ASCII 텍스트를 작성하기 위해 다른 해결책이 필요합니다. Python 2 링크와 페이지 맨 아래의 UnicodeReaderUnicodeWriter 예제를 참조하거나 3rd party unicodecsv 모듈을 살펴보세요.

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

문서 링크

반응형

댓글