Python3:编写csv文件

时间:2011-08-26 06:05:56

标签: python windows csv python-3.x

我正在尝试在Windows计算机上使用Python 3.2来编写一个简单的CSV文件,但是我没有运气。来自csv module documentation for Python 3.2

>>> 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中尝试same example for Python 2.7(文件模式的差异为'w' vs 'wb'),我尝试{{1时出错}}:

  

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

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

6 个答案:

答案 0 :(得分:61)

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

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

答案 1 :(得分:19)

这适用于Python 2和Python 3:

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

答案 2 :(得分:7)

documented中的footnote

  

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

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

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

答案 3 :(得分:2)

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

...所以修改这一行应该有效(未经测试):

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

至于为什么这个例子没有开箱即用,对我来说就像是一个小虫。

答案 4 :(得分: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"])

答案 5 :(得分: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上没有用,因为当我试图运行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,我们需要使用编解码器导入才能使它工作,希望它有所帮助..