在我的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未知参数。
newline
当然,省略换行符会导致csv文件中包含太多\r字符,因此是不可接受的。
\r
我目前正在执行向后兼容的过程,以逐步从python 2迁移到python 3.5。我的所有模块中都有很多这样的语句。
我的解决方案是将代码嵌入到自定义模块中,然后自定义模块返回文件处理程序+ writer对象。在模块内部进行python版本检查,这使得使用我的模块的任何模块都可以在任何python版本上正常工作,而不会造成太多黑客攻击。
有没有更好的办法?
在Windows上,我发现了一种更改python 2&3的方式来更改csvlineterminator选项(在Windows中以文本模式打开文件时,默认情况下"\r\n"该选项\r太多)
lineterminator
"\r\n"
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":""}
(与相比bytes,str从python 3到python 2的许多区分方法之一,在python 3中类型有所不同,这与我们当前的问题BTW非常相关)。
bytes
str
现在,我们可以使用args解包传递这些参数:
with open("out.csv",**write_args) as f: cr = csv.writer(f,delimiter=";")