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'}]



时间: 原作者:

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之间的差异,而是使用条件代码。 你只能在没有这种测试的情况下进行编写代码。

...