Python3:编写csv文件

Mik*_*e T 42 python windows csv python-3.x

我试图在Windows计算机上使用Python 3.2来编写一个简单的CSV文件,但是我没有运气.从Python 3.2csv模块文档:

>>> 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'])
Run Code Online (Sandbox Code Playgroud)

生成一个文件,每行由字节序列终止\r\r\n,因此当您用例如MS Excel打开它时,看起来每行都有一个额外的空行.这不是"CSV文件".

注意,如果我在Python 3.2中尝试Python 2.7相同示例(其中'w''wb'文件模式的区别很大),我在尝试时遇到错误spamWriter.writerow:

回溯(最近一次调用最后一次):TypeError中的文件"",第1行:'str'不支持缓冲区接口

如何在Windows计算机上从Python 3.2编写简单的CSV文件?

ale*_*n13 63

文档说你应该使用 open('eggs.csv', 'w', newline='')

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

  • 啊,似乎我选择了稍微旧版本(-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)) (2认同)

Dav*_*ton 19

这适用于Python 2和Python 3:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')
Run Code Online (Sandbox Code Playgroud)


phi*_*hag 7

作为记录在一个脚注:

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

如果csvfile是文件对象,则应使用newline =''打开它.

如果未指定newline ='',则不会正确解释嵌入在引用字段中的换行符,并且在写入时使用\ r \n linendings的平台上将添加额外的\ r \n .指定newline =''应始终是安全的,因为csv模块执行自己的(通用)换行处理.

以下变体适用于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'])
Run Code Online (Sandbox Code Playgroud)

  • 我得到一个`TypeError:'newline'是这个函数的无效关键字参数`在py34中尝试这样做. (4认同)

Ger*_*rat 5

要直接回答您的问题,您应该能够使用行终止符格式参数:

...所以修改这一行应该有效(未经测试):

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

至于为什么这个例子不能开箱即用,对我来说有点像一个错误。