用Python编写一个.CSV文件,该文件在Windows中同时适用于Python 2.7+和Python 3.3+

2024-06-16 10:23:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在同时使用Python 2.7和3.3的脚本中,我很难使用csvPython模块编写输出。

首先尝试在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'}]

Tags: csvtestforaswithitemsopenitem
2条回答

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

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)

这里的原则不是试图克服Python2和3之间的差异,而是使用条件代码。如果不进行这种测试,编写代码只能走这么远,迟早要测试Python版本。

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

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

相关问题 更多 >