2011-08-26 35 views
38

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 có may mắn. Từ csv module documentation for Python 3.2:Python3: viết các tệp csv

>>> 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 tin với mỗi dòng được kết thúc bằng chuỗi byte \r\r\n, vì vậy nó trông giống như mỗi dòng có thêm một dòng trống khi bạn mở nó với, ví dụ, MS Excel. Đây không phải là "tệp CSV".

Lưu ý, nếu tôi thử same example for Python 2.7 bằng Python 3.2 (nơi sự khác biệt lớn là 'w' vs 'wb' cho chế độ tập tin), tôi nhận được một lỗi khi tôi thử spamWriter.writerow:

Traceback (most recent call last): File "", line 1, in TypeError: 'str' does not support the buffer interface

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

+3

Sự cố dường như đặc trưng cho Windows . Hoạt động tốt trên Linux. – phihag

Trả lời

53

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

+2

Ah, có vẻ như tôi đã chọn một phiên bản cũ hơn (-0.1) của tài liệu (so sánh [3.2] (http: // docs.python.org/release/3.2/library/csv.html#csv.writer) so với [3.2.1] (http://docs.python.org/release/3.2.1/library/csv.html#csv .writer)) –

1

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

... để sửa đổi dòng này nên làm việc (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 ngoài hộp, trông giống như một lỗi đối với tôi.

+0

Đây là câu trả lời duy nhất ở đây làm việc cho tôi.Và năm năm sau, các ví dụ vẫn không hoạt động ngoài hộp :-( – Rup

5

Như documented trong một footnote:

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

If csvfile is a file object, it should be opened with newline=''.

If newline='' is not specified, newlines embedded inside quoted fields will not be interpreted correctly, and on platforms that use \r\n linendings on write an extra \r will be added. It should always be safe to specify newline='', since the csv module does its own (universal) newline handling.

Các biến thể sau đây 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']) 
+4

Tôi nhận được một 'TypeError: 'newline' là một đối số từ khóa không hợp lệ cho hàm này' khi cố gắng thực hiện điều này trong py34. –

17

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') 
1

[Đối với Python 2.x] thi này spamWriter đang làm việc cho tôi ...

with open('assignmentresults.csv', 'wb') as csvfile: 
    spamwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    spamwriter.writerow(["Hullo", "World"]) 
+1

Đây không phải là câu trả lời cho Python 3, điều này làm tăng" TypeError: 'str' không hỗ trợ giao diện bộ đệm " –

1

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

Python2.6.6 (tôi đang cố gắng để làm một số obfuscation trên csvfile của tôi)

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

Trên làm việc tốt với python2.6.6 nhưng đã không làm việc trên python3.4.3 như tôi đã nhận được một số utf-8 lỗi unicode khi tôi đã cố gắng để chạy các tập tin python3, vì vậy tôi đã thay đổi dưới đây 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')) 

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