Helpex - Trao đổi & giúp đỡ Đăng nhập

Python3: viết tệp csv

Võ Văn Minh
· 06:05 26/08/2011
10 giờ trước

Tôi đang cố gắng sử dụng Python 3.2 trên máy tính Windows để viết một tệp CSV đơn giản, tuy nhiên, tôi không gặp may. Từ tài liệu mô-đun csv cho Python 3.2 :

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE_MINIMAL)
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

tạo ra một tệp với mỗi dòng được kết thúc bằng chuỗi byte \r\r\n, vì vậy có vẻ như mỗi dòng có thêm một dòng trống khi bạn mở nó bằng MS Excel. Đây không phải là "tệp CSV".

Lưu ý, nếu tôi thử cùng một ví dụ cho Python 2.7 trong Python 3.2 (trong đó sự khác biệt lớn là 'w'so 'wb'với chế độ tệp), tôi gặp lỗi khi thử spamWriter.writerow:

Traceback (lần gọi gần đây nhất): Tệp "", dòng 1, trong TypeError: 'str' không hỗ trợ giao diện đệm

Làm cách nào để viết một tệp CSV đơn giản từ Python 3.2 trên máy tính Windows?

42 hữu ích 1 bình luận 86k xem chia sẻ
Huỳnh Khánh Tâm
· 06:49 26/08/2011
06:49:25 26/08/2011

Tài liệu nói rằng bạn nên sử dụng open('eggs.csv', 'w', newline='')

http://docs.python.org/py3k/library/csv.html#id2

66 hữu ích 1 bình luận chia sẻ
Đặng Việt Phong
· 21:59 27/06/2012
21:59:36 27/06/2012

Điều này sẽ hoạt động trên cả Python 2 và Python 3:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')
19 hữu ích 0 bình luận chia sẻ
Ngô Bích Thu
· 06:49 26/08/2011
06:49:52 26/08/2011

Như được ghi lại trong chú thích cuối trang :

csv.writer(csvfile, dialect='excel', **fmtparams)

Nếu csvfile là một đối tượng tệp, nó phải được mở bằng newline = ''.

Nếu newline = '' không được chỉ định, các dòng mới nhúng bên trong các trường được trích dẫn sẽ không được diễn giải chính xác và trên các nền tảng sử dụng \ r \ n linendings khi ghi thêm \ r sẽ được thêm vào . Sẽ luôn an toàn khi chỉ định newline = '', vì mô-đun csv thực hiện xử lý dòng mới (phổ quát) của riêng nó.

Biến thể sau hoạt động trên Linux và Windows:

spamWriter = csv.writer(open('eggs.csv', 'wb'), delimiter=' ', quotechar='|',
                        quoting=csv.QUOTE_MINIMAL, newline='')
spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
7 hữu ích 1 bình luận chia sẻ
Lý Minh Kỳ
· 06:18 26/08/2011
06:18:21 26/08/2011

Để trả lời trực tiếp câu hỏi của bạn, bạn có thể sử dụng tham số định dạng lineterminator :

... vì vậy việc sửa đổi dòng này sẽ hoạt động (chưa được kiểm tra):

>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')

Đối với lý do tại sao ví dụ không hoạt động tốt, tôi thấy nó giống như một lỗi.

2 hữu ích 1 bình luận chia sẻ
Trần Duy An
· 19:02 23/11/2016
19:02:01 23/11/2016

Tôi đã giải quyết lỗi này khi tôi đang di chuyển một trong các mã của mình từ Python2.6.6 sang python3.4.3

Python2.6.6 (Tôi đang cố gắng thực hiện một số xáo trộn trên csvfile của mình)

with open( os.path.join(path, name) , 'r') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))

Ở trên hoạt động tốt với python2.6.6 nhưng không hoạt động trên python3.4.3 vì tôi gặp một số lỗi unicode utf-8 khi tôi cố gắng chạy tệp python3, vì vậy tôi đã thực hiện các thay đổi bên dưới Python3.4.4

import codecs
with codecs.open(os.path.join(path, name) , 'r', encoding='ISO-8859-1') as mycsvfile:
writer = csv.writer(open(newFilename, 'w'))

Vậy đó, mã của tôi hiện hoạt động tốt, về cơ bản python3 không xem xét một số unicode và chúng tôi cần sử dụng nhập codec để làm cho nó hoạt động, hy vọng nó sẽ giúp ..

1 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python windows csv python-3.x , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm