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='')
这将适用于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"])