我很难在一个适用于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'}]
答案 0 :(得分:8)
这是一种更简单的通用方式:
{{1}}
这里的原则不是试图对抗Python 2和3之间的差异,而是要有条件代码。如果没有这种测试,你只能编写代码,迟早你将不得不测试Python版本。
答案 1 :(得分:6)
我尝试了几种方法。据我所知,简单地使用'w'
可能是一个解决方案:
with open('test.csv', 'w') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=['header1', 'header2'], lineterminator='\n')
# write something