2011-08-26 126 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不考虑一些统一的,我们需要使用的编解码器导入以使其工作,希望它有助于..