在python 2或python 3中编写csv文件的便携方式

Jea*_*bre 9 python windows csv python-2.7 python-3.x

在我的Windows框中,我通常在python 2中执行此操作来编写csv文件:

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

既然python 3禁止将文本文件写为二进制文件,那么这段代码就不再起作用了.这样可行:

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

问题是:newlinePython 2不知道参数.

当然,省略换行会导致csv文件中包含太多\r字符,因此无法接受.

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

我的解决方案是将代码嵌入到自定义模块中,自定义模块返回文件处理程序+编写器对象.在模块内部进行python版本检查,允许使用我的模块的任何模块在没有太多黑客攻击的情况下使用任何python版本.

有没有更好的办法?

Jea*_*bre 9

在Windows上,我发现了一个python 2&3兼容的方式来改变csv lineterminator选项(默认情况下"\r\n",\r当文件在Windows中以文本模式打开时,太多了)

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"])
Run Code Online (Sandbox Code Playgroud)

无论python版本如何,都会创建一个没有臭名昭着的"空白行"的csv文件.

唯一的缺点是,在Linux上,这种方法会产生\r不含文件,但这可能不是标准(尽管文件仍然在Excel中正常打开,没有空行,仍然几行:))

问题仍然存在于3.6.2(刚检查过我自己应该有一段时间以前)