【发布时间】:2015-07-02 15:58:58
【问题描述】:
编辑:我把它放在标题中,但我意识到我没有在正文中提到它。这似乎是特定于 Windows 的。
我很难在适用于 Python 2.7 和 3.3 的脚本中使用 csv Python 模块编写输出。
第一次尝试在 Python 2.7 中按预期工作:
with open('test.csv', 'wb') as csv_file:
writer = csv.DictWriter(csv_file, ['header1', 'header2'])
writer.writeheader()
for item in items:
writer.writerow(item)
然而,当同样的事情在 Python 3.3 中运行时,你会得到:
TypeError: 'str' does not support the buffer interface
所以我将'wb' 更改为'wt' 并且它运行了,但现在我在文件中每隔一行有一个额外的空白行。
为了解决这个问题,我改变了:
with open('test.csv', 'wt') as csv_file:
到:
with open('test.csv', 'wt', newline='') as csv_file:
但现在,它破坏了 Python 2.7:
TypeError: 'newline' is an invalid keyword argument for this function
我知道我可以这样做:
try:
with open('test.csv', 'wt', newline='') as csv_file:
writer = csv.DictWriter(csv_file, ['header1', 'header2'])
writer.writeheader()
for item in items:
writer.writerow(item)
except TypeError:
with open('test.csv', 'wb') as csv_file:
writer = csv.DictWriter(csv_file, ['header1', 'header2'])
writer.writeheader()
for item in items:
writer.writerow(item)
但是,这有一些严重的重复。
有人有更清洁的方法吗?
编辑:测试数据很简单,没有换行符或任何东西:
items = [{'header1': 'value', 'header2': 'value2'},
{'header1': 'blah1', 'header2': 'blah2'}]
【问题讨论】:
-
你不能用
'w'代替'wb'或'wt'吗? -
当您在 Python 2 中运行脚本时,您的
items列表中的字符串是否为unicode字符串?这些值是否总是 ASCII,或者它们是否包含需要编码的额外字符?即使您能够在两个版本的 Python 下运行相同的代码,也可能不会得到相同的结果! -
@Blckknght - 我将测试数据添加到问题的底部。它只是 ASCII 文本。
标签: python python-2.7 csv python-3.x python-3.3