在我的 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()
问题是:newline
参数对于 Python 2 是未知的。
当然,省略换行符会导致 csv 文件中包含太多 \r
字符,因此是 Not Acceptable 。
我目前正在执行一个向后兼容的过程,以逐步从 python 2 迁移到 python 3.5 我所有的模块中都有很多这样的语句。
我的解决方案是将代码嵌入自定义模块,自定义模块返回文件处理程序 + 编写器对象。 python 版本检查在模块内部完成,这允许使用我的模块的任何模块都可以在任何 python 版本上工作,而无需太多黑客攻击。
有没有更好的办法?
最佳答案
在 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"])
无论是什么 python 版本,都会创建一个没有臭名昭著的“空白行”的 csv 文件。
唯一的缺点是,在 Linux 上,这种方法会产生 \r
-free 文件,这可能不是标准的(尽管文件仍然可以在 excel 中正常打开,没有空行,还有几行:))
问题在 3.6.2 上仍然存在(刚刚检查了我自己,就像我应该早点检查一样)
另一种方法是使用字典作为参数:
write_args = {"mode":"wb"} if bytes is str else {"mode":"w","newline":""}
(比较bytes
和str
是区分python 2和python 3的众多方法之一,在python 3中类型是不同的,这与我们当前的非常相关顺便说一句)。
现在我们可以通过 args 解包传递这些参数:
with open("out.csv",**write_args) as f:
cr = csv.writer(f,delimiter=";")
关于python - 在 python 2 或 python 3 中编写 csv 文件的便携方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38808284/