用python2或python3编写csv文件的可移植方法

2024-03-29 01:37:57 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的Windows系统中,我通常用python 2编写csv文件:

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

既然Python3禁止将文本文件写成二进制文件,那么这段代码就不能再工作了。这是有效的:

^{pr2}$

问题是:newline参数对于python2是未知的。在

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

我目前正在执行一个向后兼容的过程,逐步从Python2迁移到Python3.5 在我所有的模块中都有很多这样的语句。在

我的解决方案是将代码嵌入到自定义模块中,自定义模块返回file handler+writer对象。python版本检查是在模块内部完成的,这使得任何使用我的模块的模块都可以在没有太多黑客攻击的情况下运行任何python版本。在

有更好的方法吗?在


Tags: 模块文件csv代码import版本windows系统
2条回答

对于读写csv文件,我也没有找到更好的方法-但是我将封装成一个单独的函数,如下所示。这样做的好处是逻辑都放在一个地方,而不是重复,如果需要不止一次。在

import csv
import sys

def open_csv(filename, mode='r'):
    """Open a csv file in proper mode depending on Python verion."""
    return(open(filename, mode=mode+'b') if sys.version_info[0] == 2 else
           open(filename, mode=mode, newline=''))

with open_csv('out.csv', 'w') as f:
    writer = csv.writer(f, delimiter=';')
    writer.writerow([1, 2, 3])
    writer.writerow(['a', 'b', 'c'])

在Windows上,我发现了一种与python2&3兼容的方法来更改csv lineterminator选项(默认为"\r\n",当文件在Windows中以文本模式打开时,\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自由文件,这可能不是标准的(尽管文件在excel中仍然可以正常打开,没有空行,还有几行:)

问题仍然存在于3.6.2(只是检查了一下我自己,就像我以前应该做的那样)

相关问题 更多 >