Python3:写入CSV文件

42 投票
6 回答
92518 浏览
提问于 2025-04-17 00:23

我在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时会出现错误:

追踪记录(最近的调用在前): 文件 "", 第1行, 在 TypeError: 'str' 不支持缓冲接口

我该如何在Windows电脑上用Python 3.2写一个简单的CSV文件呢?

6 个回答

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'])
20

这段代码在Python 2和Python 3中都能运行:

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

文档上说你应该使用 open('eggs.csv', 'w', newline='') 这个命令。

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

撰写回答