当前位置: 首页 > 面试题库 >

在python 2或python 3中编写csv文件的可移植方式

陈修诚
2023-03-14
问题内容

在我的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未知参数。

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

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

我的解决方案是将代码嵌入到自定义模块中,然后自定义模块返回文件处理程序+
writer对象。在模块内部进行python版本检查,这使得使用我的模块的任何模块都可以在任何python版本上正常工作,而不会造成太多黑客攻击。

有没有更好的办法?


问题答案:

在Windows上,我发现了一种更改python
2&3的方式来更改csvlineterminator选项(在Windows中以文本html" target="_blank">模式打开文件时,默认情况下"\r\n"该选项\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-free文件,这可能不是标准文件(尽管文件仍然可以在excel中正确打开,没有空行,但仍然有几行:)

问题在3.6.2上仍然存在(就像我应该在一段时间前检查自己一样)

一种替代方法是使用字典作为参数:

write_args = {"mode":"wb"} if bytes is str else {"mode":"w","newline":""}

(与相比bytesstr从python 3到python 2的许多区分方法之一,在python
3中类型有所不同,这与我们当前的问题BTW非常相关)。

现在,我们可以使用args解包传递这些参数:

with open("out.csv",**write_args) as f:
    cr = csv.writer(f,delimiter=";")


 类似资料:
  • 问题内容: 我试图在Windows计算机上使用Python 3.2编写一个简单的CSV文件,但是我没有运气。从Python 3.2 的csv模块文档中: 产生一个文件,该文件的每一行都以字节序列结尾,因此当您使用MS Excel等打开文件时,每行看起来都有一个多余的空行。这不是“ CSV文件”。 请注意,如果我在Python 3.2中尝试相同的Python 2.7示例(最大的区别在于文件模式与vs

  • 问题内容: 您实际上从编写可移植的SQL并消除了方言的专有工具/语法中受益吗? 我从来没有见过有人花很多时间在mysql上构建复杂的应用程序,然后说 您知道那会是桃子吗? 让我们切换到(PostGreSQL | Oracle | SQL Server)! -say- PHP中的通用库确实提取了SQL的复杂性,但是要花多少钱呢?最终您将无法使用有效的构造和功能,因为您可能永远不会使用这种假定的可移植

  • 在将带有Django 1.1.11的python2项目移植到Python3.7和Django 2.2.5时,我在依赖项中遇到了错误。 我在python2中使用Django-mobileesp,当我将代码更新到python3时,它会给出UserAgent中间件的错误。 线程django主线程中的异常:回溯(最近一次调用):文件“/usr/lib/python3.7/threading.py”,第91

  • 问题内容: 我目前正在将Python2脚本移植到Python3,并在此行遇到问题: 当我使用Python2运行它时,该文件由十六进制值组成,如预期的那样。 但是,当我使用Python3运行它时,文件由hex-values组成。 这是怎么了 如何使用Python3接收所需的输出。 问题答案: 字节序列是字符U + 00FE 的UTF-8编码表示形式。 Python 2将字符串作为字节序列而不是字符来

  • 文件移植性 幸运的是,对于许多在不同操作系统下工作的用户,Subversion命令行程序的行为方式几乎完全一致,如果你知道在一个平台上如何运行svn,你也就学会了在其他平台上运行。 然而,这一点在本软件的其他几类地方或Subversion保持的实际文件并不一定都是正确的。例如,在一个Windows系统,“文本文件”的定义与Linux环境下的类似,但是也有区别—行结束的字符串并不相同。当然也有其他的

  • 本文向大家介绍Python3导入CSV文件的实例(跟Python2有些许的不同),包括了Python3导入CSV文件的实例(跟Python2有些许的不同)的使用技巧和注意事项,需要的朋友参考一下 导入CSV文件导入数据的步骤 ①打开xxx.csv文件 ②首先读取文件头 ③然后读取剩余头 ④当发生错误时抛出异常 读取完所有内容后,打印文件头和剩余所有行 代码: 以上这篇Python3导入CSV文件的