小编典典

在python 2或python 3中编写csv文件的可移植方式

python

在我的Windows机器上,我通常在python 2中执行此操作以编写一个csv文件:

import csv
f = open("out.csv","wb")
cr = csv.writer(f,delimiter=';')
cr.writerow(["a","b","c"])
f.close()

现在python 3禁止将文本文件编写为二进制文件,该代码段不再起作用。这样可行:

import csv
f = open("out.csv","w",newline='')
cr = csv.writer(f,delimiter=';')
cr.writerow(["a","b","c"])
f.close()

问题是:newlinePython 2未知参数。

当然,省略换行符会导致csv文件中包含太多\r字符,因此是不可接受的。

我目前正在执行向后兼容的过程,以逐步从python 2迁移到python 3.5。我的所有模块中都有很多这样的语句。

我的解决方案是将代码嵌入到自定义模块中,然后自定义模块返回文件处理程序+
writer对象。在模块内部进行python版本检查,这使得使用我的模块的任何模块都可以在任何python版本上正常工作,而不会造成太多黑客攻击。

有没有更好的办法?


阅读 163

收藏
2020-12-20

共1个答案

小编典典

在Windows上,我发现了一种更改python
2&3的方式来更改csvlineterminator选项(在Windows中以文本模式打开文件时,默认情况下"\r\n"该选项\r太多)

import csv

with open("out.csv","w") as f:
    cr = csv.writer(f,delimiter=";",lineterminator="\n")
    cr.writerow(["a","b","c"])
    cr.writerow(["d","e","f"])
    cr.writerow(["a","b","c"])
    cr.writerow(["d","e","f"])

无论使用什么python版本,都将创建一个没有臭名昭著的“空白行”的csv文件。

唯一的缺点是,在Linux上,此方法将生成\r-free文件,这可能不是标准文件(尽管文件仍然可以在excel中正确打开,没有空行,但仍然有几行:)

问题在3.6.2上仍然存在(就像我应该在一段时间前检查自己一样)

一种替代方法是使用字典作为参数:

write_args = {"mode":"wb"} if bytes is str else {"mode":"w","newline":""}

(与相比bytesstr从python 3到python 2的许多区分方法之一,在python
3中类型有所不同,这与我们当前的问题BTW非常相关)。

现在,我们可以使用args解包传递这些参数:

with open("out.csv",**write_args) as f:
    cr = csv.writer(f,delimiter=";")
2020-12-20