Windows에서 추가 캐리지 리턴을 추가하는 Python의 CSV


231
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에서 발생할 수 있습니다.

답변:


311

파이썬 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파일에 관찰했다.

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


3
이것은 ASCII에는 적합하지만 UTF-8과 같은 인코딩을 중단합니다. 아래의 Jason 솔루션이 저에게 효과적이었습니다.
Tom

66
Python 3에서는 파일 객체에 다음 옵션을 사용하여 문제를 해결할 수있었습니다 open(..., "w", newline="\n", encoding="utf-8"). newline같은 결과로 빈 문자열이 될 수도 있습니다. "wb"Python 3에서 작동하지 않으면 문자열과 버퍼 인터페이스가 호환되지 않습니다.
CodeManX

여분의 캐리지 리턴 처리의 우아한 방법
ForeverLearner

2
Python2에서는 작동하지 않으므로 2와 3 모두와 호환되어야하는 경우 @ jason-r-coombs의 답변을 사용하십시오.writer = csv.writer(f, lineterminator='\n')
yossiz74

4
이것은 기본적이고 일반적이며 간단한 API가 필요에 따라 작동하지 않는 것이 부끄러운 일입니다.
SomethingSomething

248

@ 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를 이진 형식으로 처리하는 것보다 동작이 바람직하고 자연 스럽다고 생각합니다. 귀하의 고려에 대한 대안으로이 답변을 제공합니다.


6
이것은 내 의견으로는 가장 좋은 대답입니다. 유닉스에서 문제가되는 것에 관해서는 sys.platform을 호출하고 동적으로 처리하는 것은 어떻습니까?
sovemp

4
내 의견으로는 가장 좋은 대답이며 lineterminator = '\ n'은 아름답게 작동합니다.
eikonal

1
"CSV 라이터에 모든 입력을 인코딩하지 않으면"발생하는 문제의 예를들 수 있습니까?
Stephen

주의 :이 방법을 사용하면 \r더 이상 탈출 할 수 없습니다! 에 버그가있는 것 csvwriter같지만 적합하지 않은 CSV를 출력하면 이것이 갈 수 없다는 것을 의미합니다 .
flow2k

^M수락 된 답변의 2 가지 제안이 효과가 없었던 동안 이것은 문제를 해결 했습니다.
user985366

55

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

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

에 따라 문서 .

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

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


2
@ Yibo-Yang, 당신은 많은 시간을 절약했습니다.
1man

4
큰. 나는 파이썬 3.5 에서이 방법을 확인했다
jef

이것이 기본 동작이 아닌 이유는 무엇입니까?
Marc Stober

6

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'])

1
Python 3.5.2에서는 이것이 나를 위해 일한 유일한 방법이었습니다 (잘 사용했습니다 lineterminator='\n'). CSV 모듈이의 출처 인 것 같습니다 \r\n. open영향을 줄 수있는 논증 은 없습니다.
Tommy

5

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


3

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

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

2

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.