Python3:编写 csv 文件
Posted
技术标签:
【中文标题】Python3:编写 csv 文件【英文标题】:Python3: writing csv files 【发布时间】:2011-11-04 06:18:18 【问题描述】:我正在尝试在 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'
与 'wb'
用于文件模式),当我尝试 spamWriter.writerow
时会出现错误:
回溯(最近一次调用最后一次):文件“”,第 1 行,类型错误:'str' 不支持缓冲区接口
如何在 Windows 计算机上从 Python 3.2 编写简单的 CSV 文件?
【问题讨论】:
问题似乎是特定于 Windows 的。在 Linux 上运行良好。 【参考方案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"])
【讨论】:
这不是 Python 3 的答案,它会引发“TypeError: 'str' does not support the buffer interface”【参考方案2】:我在将我的一个代码从 Python2.6.6 移动到 python3.4.3 时解决了这个错误
Python2.6.6(我正在尝试对我的 csvfile 进行一些混淆)
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,我们需要使用编解码器导入来使其工作,希望对您有所帮助..
【讨论】:
mycsvfile
是什么,缩进呢?【参考方案3】:
这适用于 Python 2 和 Python 3:
if sys.version_info >= (3,0,0):
f = open(filename, 'w', newline='')
else:
f = open(filename, 'wb')
【讨论】:
【参考方案4】:作为documented 中的footnote:
csv.writer(csvfile, dialect='excel', **fmtparams)
如果 csvfile 是文件对象,则应使用 newline='' 打开它。 如果未指定 newline='',则嵌入在引用字段中的换行符将不会被正确解释,并且在使用 \r\n linendings on write 的平台上将添加一个额外的 \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'])
【讨论】:
我在 py34 中尝试执行此操作时收到TypeError: 'newline' is an invalid keyword argument for this function
。【参考方案5】:
文档说你应该使用open('eggs.csv', 'w', newline='')
http://docs.python.org/py3k/library/csv.html#id2
【讨论】:
啊,我似乎选择了一个稍微旧版本(-0.1)的文档(比较 3.2 与 3.2.1)【参考方案6】:要直接回答您的问题,您应该可以使用lineterminator 格式化参数:
...所以修改这一行应该可以工作(未经测试):
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), delimiter=' ',
... quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
至于为什么这个例子不能开箱即用,对我来说有点像一个错误。
【讨论】:
这是唯一对我有用的答案。五年后,这些例子仍然不能开箱即用:-( 这是我在 Python 3.7 上唯一有效的答案,以上都不起作用以上是关于Python3:编写 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章
使用writer.writerows(reader)在python3中逐个编写csv行而不是一次写入csv行