Python3:写入CSV文件
我在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='')
这个命令。