Python3:编写CSV文件

42

我正在尝试在Windows电脑上使用Python 3.2编写一个简单的CSV文件,但是我没有成功。根据Python 3.2的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中尝试Python 2.7的相同示例(其中最大的区别是文件模式的'w''wb'),当我尝试使用spamWriter.writerow时会出现错误:

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

如何在Windows计算机上使用Python 3.2编写一个简单的CSV文件?


4
问题似乎只出现在Windows上,在Linux上运行良好。 - phihag
6个回答

68

2
啊,看起来我拿到了稍旧的版本(-0.1)的文档(对比3.23.2.1)。 - Mike T

20

这将在Python 2和Python 3上均可运行:

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

7
文档中所述,如脚注所示:

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

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

如果未指定newline='',则嵌入在引号字段内的换行符将无法正确解释,并且在使用\r\n行尾的平台上会添加额外的\r。始终指定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'])

4
在py34中尝试这样做时,会收到“TypeError: 'newline'是此函数的无效关键字参数”的错误提示。 - Andy Hayden

5
直接回答你的问题,你应该能够使用格式化参数 lineterminator
...所以修改这一行应该能够运行(未经测试):
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
...                         quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')

至于为什么这个示例不能直接使用,看起来有点像一个 bug。


这是唯一一个对我有用的答案。五年后,这些示例仍然不能直接使用 :-( - Rup
这是我在Python 3.7上唯一有效的答案,以上所有答案都无效。 - Diego Andrés Díaz Espinoza
这对我也起作用,其中 newline='' 没有起作用。 - Huw Walters

1
我将这个错误解决了,因为我正在将我的代码从Python2.6.6移植到python3.4.3。
Python2.6.6(我试图对我的csv文件进行一些混淆)
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.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不会考虑一些Unicode字符,我们需要使用codecs导入才能使其正常工作,希望有所帮助。


2
mycsvfile是什么?缩进又如何处理? - Roko C. Buljan

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的答案,Python 3会报错 "TypeError: 'str' does not support the buffer interface"。 - Mike T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接