Windows에서 추가 캐리지 리턴을 추가하는 Python의 CSV = file(‘test.csv’, ‘w’) writer

import csv
outfile = file('test.csv', 'w')
writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['hi','dude'])
writer.writerow(['hi2','dude2'])
outfile.close()

다음 과 같이 각 행에 test.csv여분 의 파일을 생성합니다 \r.

test.csv

hi,dude\r\r\nhi2,dude2\r\r\n

예상되는 대신 :

hi,dude\r\nhi2,dude2\r\n

왜 이런 일이 발생합니까 아니면 실제로 원하는 동작입니까?

노트 :

  • 이 동작은 Python 2 또는 3에서 발생할 수 있습니다.


답변

파이썬 3 :

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    ...
  • CoDEmanX 의 의견에서 언급했듯이 설정하십시오.newline='\n'
with open('output.csv', 'w', newline='\n', encoding='utf-8') as f:
    writer = csv.writer(f)
    ...

파이썬 2 :

Windows에서는 파일 을 또는로 전달하기 전에 항상 이진 모드 ( "rb"또는 "wb")로 파일을여십시오 .csv.readercsv.writer

파일은 텍스트 파일이지만 CSV는 레코드 를 분리 하여 관련 라이브러리 에서 이진 형식으로 간주 \r\n합니다. 그 구분은 텍스트 모드로 작성하면, 파이썬 런타임은 대체 \n\r\n따라서, \r\r\n파일에 관찰했다.

이 이전 답변을 참조하십시오 .


답변

@ john-machin 이 좋은 답변을 제공 하지만 항상 최선의 방법은 아닙니다. 예를 들어, 모든 입력을 CSV 기록기로 인코딩하지 않으면 Python 3에서는 작동하지 않습니다. 또한 스크립트가 sys.stdout을 스트림으로 사용하려는 경우 문제를 해결하지 않습니다.

라이터를 만들 때 ‘lineterminator’속성을 대신 설정하는 것이 좋습니다.

import csv
import sys

doc = csv.writer(sys.stdout, lineterminator='\n')
doc.writerow('abc')
doc.writerow(range(3))

이 예제는 Python 2 및 Python 3에서 작동하며 원치 않는 줄 바꿈 문자를 생성하지 않습니다. 그러나 원하지 않는 줄 바꿈이 발생할 수 있습니다 (Unix 운영 체제에서 LF 문자 생략).

그러나 대부분의 경우 모든 CSV를 이진 형식으로 처리하는 것보다 동작이 바람직하고 자연 스럽다고 생각합니다. 귀하의 고려에 대한 대안으로이 답변을 제공합니다.


답변

파이썬 3에서는 (파이썬 2에서는 이것을 시도하지 않았습니다) 간단하게 할 수도 있습니다

with open('output.csv','w',newline='') as f:
    writer=csv.writer(f)
    writer.writerow(mystuff)
    ...

에 따라 문서 .

이 문서의 각주 에서 이에 대한 자세한 내용 :

newline = ”을 지정하지 않으면 따옴표로 묶인 필드에 포함 된 줄 바꿈이 올바르게 해석되지 않으며 \ r \ n 린딩을 사용하는 플랫폼에서 추가 \ r이 추가됩니다. csv 모듈은 자체 (범용) 개행 처리를 수행하므로 항상 newline = ”을 지정하는 것이 안전해야합니다.


답변

csv writer 명령에서 lineterminator = ‘\ n’ 매개 변수를 도입 할 수 있습니다 .

import csv
delimiter='\t'
with open('tmp.csv', '+w', encoding='utf-8') as stream:
    writer = csv.writer(stream, delimiter=delimiter, quoting=csv.QUOTE_NONE, quotechar='',  lineterminator='\n')
    writer.writerow(['A1' , 'B1', 'C1'])
    writer.writerow(['A2' , 'B2', 'C2'])
    writer.writerow(['A3' , 'B3', 'C3'])

답변

정확히 왜 발생하는지 잘 모르겠지만 파일 모드를 “w”에서 “wb”로 변경하면 문제가 해결됩니다. 자세한 내용은 ” ^ M 제거 방법 “에 대한 내 답변을 참조하십시오.


답변

다음과 같이 함수를 열려면 newline = “\ n”속성을 추가해야합니다.

with open('file.csv','w',newline="\n") as out:
    csv_out = csv.writer(out, delimiter =';')

답변

DictWriter를 사용하는 경우 open 함수의 새 줄과 writerow 함수의 새 줄이 있습니다. open 함수 내에서 newline = ”을 사용하여 추가 개행을 제거 할 수 있습니다.