반응형
질문
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 링크와 페이지 맨 아래의 UnicodeReader
및 UnicodeWriter
예제를 참조하거나 3rd party unicodecsv 모듈을 살펴보세요.
#!python2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
writer = csv.writer(outfile)
문서 링크
반응형
댓글