2012-01-05 1 views
71

DictWriter를 사용하여 사전의 데이터를 csv 파일로 출력하고 있습니다. 왜 CSV 파일에 각 데이터 라인 사이에 빈 줄이 있습니까? 그것은 큰 거래는 아니지만 "double-spacing"이 파일의 줄 수를 두 배로하기 때문에 너무 많은 줄이 있기 때문에 데이터 집합이 크고 하나의 CSV 파일에 맞지 않습니다. 사전에 작성하는Python에서 Dictwriter로 출력 할 때 CSV 파일에 각 데이터 행 사이에 빈 줄이 포함되는 이유

내 코드는 다음과 같습니다

headers=['id', 'year', 'activity', 'lineitem', 'datum'] 
output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers) 
output.writerow(dict((fn,fn) for fn in headers)) 
for row in rows: 
    output.writerow(row) 

답변

89

,하여 csv 모듈 사용 Windows 스타일의 라인 터미네이터의 클래스 (\r\n)보다는 유닉스 스타일 (\n). 이것이 명백한 이중 줄 바꿈을 일으키는 원인이 될 수 있습니까?

그렇다면, 당신은 DictWriter 생성자를 재정의 할 수

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', lineterminator='\n', fieldnames=headers) 
+36

또는 open (filename, "wb")과 같이 출력 CSV를 열 수 있습니다. 나를 위해 그것을 고정. –

+4

파이썬 3이나 다른 이유가 있는지 모르겠지만 "wb"를 사용할 때는 빈 파일을 쓰지만 lineterminator = '\ n'옵션은 완벽하게 작동합니다. 부수적으로, CSV 파일을 텍스트 파일로 간주하여 이진 모드로 작성하려는 경우 직관력이 떨어집니다. 어쩌면 그것은 서면이 아닌 독서와 관련이 있을지도 모릅니다.파이썬 3에서 – Davos

+1

, 'wb'를 사용하는 경우 문자열의 인코딩을 지정하여 유니 코드 텍스트를 바이트로 변환하는 방법을 알고 있어야합니다. http://www.pythoncentral.io/encoding-and-decoding- strings-in-python-3-x/ afaik 그냥 'w'를 사용하면 문자열을 쓰면 ascii 인코딩을 사용하고 거기에 유니 코드 문자가 있으면 실패합니다. – drojf

0

난 그냥 당신의 조각을 테스트하고, 더 이중 간격 라인은 이곳에 없다. 줄 끝 나는 귀하의 경우 확인 할 그래서 뭐, \r\n있는 것은 :

  1. 편집기가 제대로 읽고 DOS는
  2. 더 \를 제출하지 N 당신의 행이 DICT의 값에 존재합니다.

는 (심지어 \ n을 사용하여 값을 넣어, DictWriter이를 automaticly 값을 인용합니다.) 기본적으로

29

http://docs.python.org/library/csv.html#csv.writer에서 :

csvfile 파일의 객체 인 경우, 그것은에서 'B'플래그를 열어야합니다 플랫폼에 따라 달라집니다.

즉, 파일을 열 때 'w'가 아니라 'wb'를 전달합니다.
쓰기가 끝나면 with 문을 사용하여 파일을 닫을 수도 있습니다.
테스트 예 아래 :

from __future__ import with_statement # not necessary in newer versions 
import csv 
headers=['id', 'year', 'activity', 'lineitem', 'datum'] 
with open('file3.csv','wb') as fou: # note: 'wb' instead of 'w' 
    output = csv.DictWriter(fou,delimiter=',',fieldnames=headers) 
    output.writerow(dict((fn,fn) for fn in headers)) 
    output.writerows(rows) 
+1

감사합니다. 방금 열린 플래그를 'w'에서 'wb'로 바꿨고 lineterminator를 추가하지 않고도 효과가있었습니다. 'wb'를 사용할 때 나중에 파이썬 스크립트에 추가 할 수 없다는 것을 알았습니다. (f, quotechar = ' "', quoting = csv.QUOTE_MINIMAL) –

10

이 줄에 'W'(쓰기) 변경 :

output = csv.DictWriter(open('file3.csv','wb'), delimiter=',', fieldnames=headers) 
님의

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers) 

'WB'(진 쓰기는) 나를 위해이 문제를 해결 에 대한 @dandrejvv하는

Python v2.75: Open()

신용 위의 원래 게시물에 대한 의견에 해결책이 있습니다.

+0

그렇지 않으면 최종 CSV는 쓰여진 마지막 줄만 포함하게됩니다. 출력 파일을 'a' – armani

관련 문제