Hướng dẫn python csv newline - python csv newline

import csv

with open['test.csv', 'w'] as outfile:
    writer = csv.writer[outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL]
    writer.writerow[['hi', 'dude']]
    writer.writerow[['hi2', 'dude2']]

Mã trên tạo ra một tệp,

hi,dude\r\nhi2,dude2\r\n
5, với thêm
hi,dude\r\nhi2,dude2\r\n
6 ở mỗi hàng, như vậy:

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

thay vì dự kiến

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

Tại sao điều này xảy ra, hoặc đây thực sự là hành vi mong muốn?

hỏi ngày 7 tháng 7 năm 2010 lúc 2:34Jul 7, 2010 at 2:34Jul 7, 2010 at 2:34

Apalopohapaapalopohapaapalopohapaapalopohapa

4.6835 huy hiệu vàng26 Huy hiệu bạc29 Huy hiệu đồng5 gold badges26 silver badges29 bronze badges5 gold badges26 silver badges29 bronze badges

1

Python 3:

Tài liệu chính thức ____10 khuyến nghị

hi,dude\r\r\nhi2,dude2\r\r\n
1ing tệp với
hi,dude\r\r\nhi2,dude2\r\r\n
2 trên tất cả các nền tảng để vô hiệu hóa bản dịch Newlines phổ quát:
with open['output.csv', 'w', newline='', encoding='utf-8'] as f:
    writer = csv.writer[f]
    ...

Người viết CSV chấm dứt từng dòng với

hi,dude\r\r\nhi2,dude2\r\r\n
3 của phương ngữ, đó là
hi,dude\r\r\nhi2,dude2\r\r\n
4 cho phương ngữ
hi,dude\r\r\nhi2,dude2\r\r\n
5 mặc định trên tất cả các nền tảng vì đó là những gì RFC 4180 đề xuất.

Python 2:

Trên Windows, luôn luôn mở các tệp của bạn ở chế độ nhị phân [

hi,dude\r\r\nhi2,dude2\r\r\n
6 hoặc
hi,dude\r\r\nhi2,dude2\r\r\n
7], trước khi chuyển chúng sang
hi,dude\r\r\nhi2,dude2\r\r\n
8 hoặc
hi,dude\r\r\nhi2,dude2\r\r\n
9.

Mặc dù tệp là một tệp văn bản, CSV được các thư viện coi là định dạng nhị phân, với các bản ghi phân tách

hi,dude\r\nhi2,dude2\r\n
0. Nếu bộ phân cách đó được viết ở chế độ văn bản, thời gian chạy Python sẽ thay thế
hi,dude\r\nhi2,dude2\r\n
1 bằng
hi,dude\r\nhi2,dude2\r\n
0, do đó
hi,dude\r\nhi2,dude2\r\n
3 được quan sát trong tệp.binary format by the libraries involved, with
hi,dude\r\nhi2,dude2\r\n
0 separating records. If that separator is written in text mode, the Python runtime replaces the
hi,dude\r\nhi2,dude2\r\n
1 with
hi,dude\r\nhi2,dude2\r\n
0, hence the
hi,dude\r\nhi2,dude2\r\n
3 observed in the file.binary format by the libraries involved, with
hi,dude\r\nhi2,dude2\r\n
0 separating records. If that separator is written in text mode, the Python runtime replaces the
hi,dude\r\nhi2,dude2\r\n
1 with
hi,dude\r\nhi2,dude2\r\n
0, hence the
hi,dude\r\nhi2,dude2\r\n
3 observed in the file.

Xem câu trả lời trước đây.

Đã trả lời ngày 7 tháng 7 năm 2010 lúc 3:57Jul 7, 2010 at 3:57Jul 7, 2010 at 3:57

John Machinjohn MachinJohn MachinJohn Machin

79,7K11 Huy hiệu vàng138 Huy hiệu bạc184 Huy hiệu đồng11 gold badges138 silver badges184 bronze badges11 gold badges138 silver badges184 bronze badges

1

Trong khi @john-machin đưa ra một câu trả lời tốt, nhưng nó không phải lúc nào cũng là cách tiếp cận tốt nhất. Ví dụ, nó không hoạt động trên Python 3 trừ khi bạn mã hóa tất cả các đầu vào của mình cho người viết CSV. Ngoài ra, nó không giải quyết vấn đề nếu tập lệnh muốn sử dụng sys.stdout làm luồng.

Thay vào đó, tôi đề nghị thiết lập thuộc tính 'lineterminator' khi tạo người viết:

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

Ví dụ đó sẽ hoạt động trên Python 2 và Python 3 và sẽ không tạo ra các ký tự dòng mới không mong muốn. Tuy nhiên, lưu ý rằng nó có thể tạo ra các dòng mới không mong muốn [bỏ qua ký tự LF trên các hệ điều hành UNIX].

Tuy nhiên, trong hầu hết các trường hợp, tôi tin rằng hành vi thích hợp hơn và tự nhiên hơn so với coi tất cả CSV là định dạng nhị phân. Tôi cung cấp câu trả lời này như một sự thay thế cho sự xem xét của bạn.

Stevoisiak

21.3K25 Huy hiệu vàng118 Huy hiệu bạc208 Huy hiệu đồng25 gold badges118 silver badges208 bronze badges25 gold badges118 silver badges208 bronze badges

Đã trả lời ngày 18 tháng 7 năm 2013 lúc 13:59Jul 18, 2013 at 13:59Jul 18, 2013 at 13:59

Jason R. Coombsjason R. CoombsJason R. CoombsJason R. Coombs

39,9k10 Huy hiệu vàng80 Huy hiệu bạc88 Huy hiệu đồng10 gold badges80 silver badges88 bronze badges10 gold badges80 silver badges88 bronze badges

6

Trong Python 3 [tôi chưa thử điều này trong Python 2], bạn cũng có thể chỉ cần làm

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

theo tài liệu.

Thêm về điều này trong chú thích của tài liệu:

Nếu newline = '' không được chỉ định, các dòng newlines được nhúng bên trong các trường được trích dẫn sẽ không được giải thích chính xác và trên các nền tảng sử dụng các lớp lót \ r \ n trên viết thêm một \ r sẽ được thêm vào. Luôn luôn an toàn để chỉ định newline = '', vì mô -đun CSV thực hiện xử lý dòng mới [phổ quát] của riêng mình.

Đã trả lời ngày 18 tháng 3 năm 2015 lúc 7:43Mar 18, 2015 at 7:43Mar 18, 2015 at 7:43

2

Bạn có thể giới thiệu tham số lineterminator = '\ n' trong lệnh CSV Writer.lineterminator='\n' parameter in the csv writer command.lineterminator='\n' parameter in the csv writer command.

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

Đã trả lời ngày 9 tháng 10 năm 2017 lúc 10:21Oct 9, 2017 at 10:21Oct 9, 2017 at 10:21

Wesam Nawesam NaWesam NaWesam Na

2.03923 Huy hiệu bạc22 Huy hiệu đồng23 silver badges22 bronze badges23 silver badges22 bronze badges

1

Bạn phải thêm thuộc tính newline = "\ n" để mở chức năng như thế này:

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

Đã trả lời ngày 1 tháng 6 năm 2017 lúc 20:41Jun 1, 2017 at 20:41Jun 1, 2017 at 20:41

Gregor Ažbegregor ažbeGregor AžbeGregor Ažbe

3536 Huy hiệu bạc11 Huy hiệu đồng6 silver badges11 bronze badges6 silver badges11 bronze badges

2

Lưu ý rằng nếu bạn sử dụng DictWriter, bạn sẽ có một dòng mới từ hàm mở và một dòng mới từ hàm Writerow. Bạn có thể sử dụng newline = '' trong hàm mở để xóa thêm dòng mới.

Đã trả lời ngày 23 tháng 10 năm 2017 lúc 21:39Oct 23, 2017 at 21:39Oct 23, 2017 at 21:39

Erick Stoneerick StoneErick StoneErick Stone

7691 Huy hiệu vàng6 Huy hiệu bạc16 Huy hiệu đồng1 gold badge6 silver badges16 bronze badges1 gold badge6 silver badges16 bronze badges

3

Bài Viết Liên Quan

Chủ Đề