2012-03-23 26 views
19

Tôi nhận thấy rằng thư viện csv bằng Python luôn tạo các ký tự cuối dòng DOS. Ngay cả khi tôi sử dụng chế độ 'wb', ngay cả khi tôi sử dụng Linux.Nhà văn csv Python có sử dụng các ký tự cuối dòng DOS không?

import csv 

f = open('output.txt', 'wb'); 
writer = csv.writer(f) 
writer.writerow([2,3,4]); 
f.close() 

Mã trên luôn sử dụng '\r\n' làm dấu phân cách cuối dòng. Làm thế nào tôi có thể làm cho nó sử dụng chỉ sử dụng '\n'?

+3

Thông số CSV MIME ủy nhiệm CRLF làm dấu tách dòng: https://tools.ietf.org/html/rfc4180 –

+0

Tôi tin rằng trình đọc csv * luôn hoạt động và không thể thay đổi, nhưng bạn chỉ hỏi về * writer *, có thể thay đổi mặc định. – smci

Trả lời

42

Bạn có thể give your writer dụ một đối số tùy chỉnh lineterminator trong constructor:

writer = csv.writer(f, lineterminator="\n") 
+0

lineterminator có thể được đưa ra như là sự kết hợp của hai nhân vật? – user1479571

+0

@ user1479571 Bạn đã thử chưa? –

19

Như Niklas answered, các lineterminator argument cho phép bạn chọn dòng cuối của bạn. Thay vì mã hóa cứng nó thành \n, hãy làm cho nền tảng độc lập bằng cách sử dụng nền tảng line separator: os.linesep của nền tảng của bạn.

import csv 
import os 

f = open('output.csv', 'wb') 
writer = csv.writer(f, lineterminator=os.linesep) 
writer.writerow([2,3,4]) 
f.close() 

Đối với những người khác tìm thấy bài đăng này, đừng bỏ lỡ 'wb'. Bạn sẽ không nhận thấy một vấn đề nếu bạn đang thiếu nó trên một số nền tảng như GNU/Linux, nhưng điều quan trọng là mở tệp trong binary mode trên các nền tảng quan trọng như Windows. Nếu không, tệp csv có thể kết thúc bằng dòng kết thúc như \r\r\n. Nếu bạn sử dụng 'wb'os.linesep, kết thúc dòng của bạn phải chính xác trên tất cả các nền tảng.

+0

vì vậy ngay cả khi bạn làm cho nhà văn "* nền tảng độc lập *", tập lệnh của bạn vẫn phụ thuộc vào nền tảng bởi vì bạn cần mở nó bằng nhị phân, nhưng chỉ khi cần thiết? Nếu tôi thử 'wb' trên linux tôi nhận được lỗi cho' writer.writeheader() ' –

+1

Tôi vừa thử nó trên Ubuntu 16.04 bằng cách sử dụng cả hai' writer' và 'DictWriter' với' wb', @CiprianTomoiaga, và nó hoạt động tốt cho tôi. Tôi đề nghị bạn đăng một câu hỏi mới với một mẫu mã và thông báo lỗi, sau đó thêm một bình luận ở đây với một liên kết đến câu hỏi của bạn. –

+1

@CiprianTomoiaga Điều này không hoạt động với Python 3. Mô-đun CSV giả định rằng nó có thể viết các chuỗi bình thường và đây không phải là trường hợp nữa nếu bạn mở tệp bằng ''wb'' (bạn sẽ nhận được một' TypError') . Vì vậy, bạn phải mở tập tin như thế này: 'f = open ('output.csv', 'w', newline = '')' khi bạn sử dụng Python 3. Xem thêm [Python 3 CSV documentation] (https: //docs.python.org/3.5/library/csv.html#csv.writer). – maxschlepzig

Các vấn đề liên quan