编辑:我把它放在标题里,但我才意识到我没有在正文里提到它。这似乎是Windows特有的。
在同时使用Python 2.7和3.3的脚本中,我很难使用csv
Python模块编写输出。
首先尝试在Python2.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)
但是,当在Python3.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:
但现在,它打破了Python2.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'}]
下面是一个简单的通用方法:
这里的原则不是试图克服Python2和3之间的差异,而是使用条件代码。如果不进行这种测试,编写代码只能走这么远,迟早要测试Python版本。
我试过几种方法。据我所见,简单地使用
'w'
可能是一个解决方案:相关问题 更多 >
编程相关推荐