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

标签 python python-3.x windows python-2.7 csv

在我的 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":""}

(比较bytesstr是区分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/

相关文章:

javascript - 使用 sum、map 和 lambda 将 Python 转为 JavaScript

python - 在 django 中手动设计处理 inlineformset_factory 的模板问题

python - 过滤作为列表的 DataFrame 行

python - 这种奇怪的结肠行为在做什么?

python-3.x - 在流中合并音频和图像

python - 确定何时没有数据库行与 Python mysql.connector 匹配

windows - 在 Windows 上配置静态路由

python - 如何判断一个目录是否是python中的windows连接

windows - 黑莓调试输出

python - 使用python的子进程通过curl下载文件