2009-07-23 18 views
36

Theo mặc định, its documentation csv.writer nên sử dụng '\ r \ n' làm trình theo dõi.Nhà văn Python 2 CSV tạo dòng kết thúc sai trên Windows

import csv 

with open("test.csv", "w") as f: 
    writer = csv.writer(f) 

    rows = [(0,1,2,3,4), 
      (-0,-1,-2,-3,-4), 
      ("a","b","c","d","e"), 
      ("A","B","C","D","E")]   

    print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n") 
    writer.writerows(rows) 
    print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n") 

này in

\r\n 
\r\n 

như mong đợi. Tuy nhiên, tạo ra csv file sử dụng lineterminator '\ r \ r \ n'

0,1,2,3,4 

0,-1,-2,-3,-4 

a,b,c,d,e 

A,B,C,D,E 

Đây có phải là một lỗi hoặc là có cái gì sai trong việc sử dụng của tôi csv.writer?

Python phiên bản:

ActivePython 2.6.2.2 (ActiveState Software Inc) dựa trên Python 2.6.2 (r262: 71600, ngày 21 tháng 4 năm 2009, 15:05:37) [MSC v 0,1500 32 bit (Intel)] trên win32

trên Windows Vista

+0

Tôi không thể tạo lại vấn đề của bạn: $ test.csv test.csv: văn bản ASCII, với các ký tự dòng CRLF –

+1

@lutz: $ prompt có nghĩa là * x có nghĩa là không có sự khác biệt (trong Python 2.x) giữa văn bản chế độ và chế độ nhị phân; OP đang chạy Windows. –

+2

@wierob: mất .replace (...). Thay thế (...), sử dụng repr được tích hợp sẵn() –

Trả lời

60

trong Python 2.x, luôn luôn mở tập tin của bạn trong nhị phân chế độ, như tài liệu . csv viết \r\n như bạn mong đợi, nhưng sau đó nằm bên dưới Windows tập tin văn bản cắt giảm cơ chế và những thay đổi mà \n-\r\n ... tổng hiệu lực: \r\r\n

Từ các tài liệu csv.writer:

Nếu csvfile là một đối tượng tập tin, nó phải được mở với cờ 'b' trên các nền tảng tạo nên sự khác biệt.

Dường như có một số sự dè dặt về thực sự thốt ra tên của thủ phạm chính :-)

+0

Dường như làm việc. Bạn có thể cho tôi biết đây là tài liệu nào không? – wierob

+6

Một "tính năng" đẹp là người ta vẫn có thể mở ở chế độ nhị phân trên các nền tảng mà nó không quan trọng - ví dụ, Linux, vì vậy luôn sử dụng chế độ nhị phân. – Arafangion

+2

Kể từ 3.6, các tài liệu bây giờ nói 'Nếu csvfile là một đối tượng tập tin, nó sẽ được mở bằng newline = ''' – jebob

15

Thật không may, đó là một chút khác nhau với các module csv cho Python 3, nhưng mã này sẽ làm việc trên cả hai Python 2 và Python 3:

if sys.version_info >= (3,0,0): 
    f = open(filename, 'w', newline='') 
else: 
    f = open(filename, 'wb') 
+0

Tôi tin rằng đây là giải pháp duy nhất hoạt động trên cả Python 2 và 3, cả Windows lẫn Linux và tạo tệp tuân thủ tiêu chuẩn CSV của '\ r \ n' bất kể nền tảng. – MestreLion

19

Để thay đổi terminator dòng trong Python 2.7 csv sử dụng nhà văn

writer = csv.writer(f, delimiter = '|', lineterminator='\n')

Đây là cách đơn giản hơn nhiều để thay đổi dấu phân cách mặc định từ \ r \ n.

+0

Điều này làm việc cho tôi trong 3,4 cũng như – Terrabits

+0

Nó hoạt động và rất đơn giản !! Tôi đang sử dụng DictWriter để stdout --- vì vậy các giải pháp trên không thực sự thích hợp hoặc bổ sung thêm chi phí. – ripvlan

+0

Related: https://stackoverflow.com/a/39379062/95852 –