2011-08-26 166 views
38

我想在Windows計算機上使用Python 3.2編寫簡單的CSV文件,但是我沒有運氣。從csv module documentation for Python 3.2Python3:編寫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']) 

產生由字節序列\r\r\n終止每行一個文件,所以它看起來像每一行都有,當你打開它一個額外的空行,例如,MS Excel中。這不是「CSV文件」。

注意,如果我嘗試在Python 3.2(其中最大的區別是'w' VS 'wb'的文件模式),我得到一個錯誤,當我嘗試spamWriter.writerowsame example for Python 2.7

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

我怎樣寫一個Windows計算機上的Python 3.2的簡單CSV文件?

+3

這個問題似乎是Windows專用。在Linux上運行良好。 – phihag

回答

53

文檔說,你應該在footnote使用open('eggs.csv', 'w', newline='')

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

+2

啊,看起來我拿起了一個稍微老的版本(-0.1)的文檔(比較[3.2](http:// docs.python.org/release/3.2/library/csv.html#csv.writer)vs [3.2.1](http://docs.python.org/release/3.2.1/library/csv.html#csv .writer)) –

1

直接回答你的問題,你應該能夠使用lineterminator格式參數:

...所以修改這條線應該工作(未經測試):

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

至於爲什麼例子並不適用於開箱即用,看起來像是一個bug。

+0

這是我工作的唯一答案。五年後,這些例子仍然不能用於開箱即用:-( – Rup

5

由於documented

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.

以下變種可以在Linux和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

當我嘗試在py34中執行此操作時,出現'TypeError:'newline'是此函數的無效關鍵字參數。 –

17

這將兩個Python 2和Python 3的工作:

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

[對於Python 2.x的] spamWriter的實現是爲我工作...

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

這不是Python 3的答案,它引發了「TypeError:'str'不支持緩衝接口「 –

1

我解決了這個錯誤,因爲我是移動從Python2.6.6我的代碼python3.4.3

Python2.6.6一個(我試圖做一些混淆我csvfile)

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

上面帶有python2.6.6運作良好,但是,作爲python3.4.3我得到了一些UTF-8的Unicode錯誤,當我試圖運行python3文件沒有工作,所以我做了如下改變 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')) 

就是這樣,我的代碼現在工作得很好,基本上python3不考慮一些統一的,我們需要使用的編解碼器導入以使其工作,希望它有助於..