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

Traceback(最近一次调用的最后一个):TypeError中的文件“”,第1行:“str”不支持缓冲区接口

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

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

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

这将适用于Python 2和Python 3:

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

正如脚注中所logging :

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

如果csvfile是一个文件对象,应该用newline =''打开。

如果未指定newline ='',embedded在引用字段中的换行符将不会被正确解释,并且在使用\ 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']) 

要直接回答你的问题,你应该可以使用lineterminator格式参数:

…所以修改这条线应该工作(未经testing):

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

至于为什么这个例子不能用于开箱即用,对我来说就像是一个bug。

我解决了这个错误,因为我正在将我的一个代码从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上工作,因为我试图运行python3文件时,得到了一些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,我们需要使用的编解码器导入,使其工作,希望它可以帮助..

[对于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"])