python-2.7 - 在 python 中编写. CSV 文件,该文件既适用于 python 2.7 +,也适用于 Windows 中的python 3.3 +

  显示原文与译文双语对照的内容
58 3

编辑:我把它放在标题里,但只是意识到我没有在正文中提到它。这似乎是针对 Windows的。

我在脚本中使用 csv python 模块编写输出时很难使用 python 2.7和 3.3进行编写。

首先尝试 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个回答

123 4

我尝试了几种方法。就我所见,简单使用 'w' 可能是一个解决方案:

with open('test.csv', 'w') as csv_file:
 writer = csv.DictWriter(csv_file, fieldnames=['header1', 'header2'], lineterminator='n')
 # write something
原作者:
95 1

下面是一个简单的通用方法:

import sys
if sys.version_info[0] == 2: # Not named on 2.6
 access = 'wb'
 kwargs = {}
else:
 access = 'wt'
 kwargs = {'newline':''}
with open('test.csv', access, **kwargs) as csv_file:
 writer = csv.DictWriter(csv_file, ['header1', 'header2'])
 writer.writeheader()
 for item in items:
 writer.writerow(item)

这里的原则不是试图对抗 python 2和 3之间的差异,而是使用条件代码。你只能在没有这种测试的情况下进行编写代码。

原作者:
...