Python csv writer 在空的第一行添加引号,但不在后续行上添加引号

标签 python python-3.x csv

我正在尝试使用 python 的 csv 标准库模块来生成逗号分隔值 (csv) 文件。

不允许第一行为空。更烦人的是,它对待第一行与其他行的方式不同,因此空列表在一种情况下给出空字符串(“”),然后给出空行:

import csv
import io

def make_csv(rows):
  with io.StringIO(newline='') as sout:
    writer = csv.writer(sout, quoting=csv.QUOTE_MINIMAL)
    writer.writerows(rows)
    return sout.getvalue()

根据上述定义,解释器 session 可能如下所示:

>>> make_csv([[''], ['']]) # (only the) first line has quoted empty string
'""\r\n\r\n'

>>> make_csv([['A'], ['A']]) # expected: same input row, same output row
'A\r\nA\r\n'

为什么这个带引号的空字符串只出现在第一行?有什么方法可以阻止它,或者至少获得更一致的行为?

<小时/>

更新:这是 2017 年 12 月报告的错误,编号为 https://bugs.python.org/issue32255 ,并通过提交 https://github.com/python/cpython/commit/2001900b0c02a397d8cf1d776a7cc7fcb2a463e3 解决,已包含在 3.6.5 版本中

最佳答案

您可以通过设置不同的 quoting strategy 来强制 csv 编写器引用空字符串。 。两者QUOTE_ALLQUOTE_NONNUMERIC会做你想做的事:

def make_csv(rows):
  with io.StringIO(newline='') as sout:
    writer = csv.writer(sout, quoting=csv.QUOTE_NONNUMERIC)
    writer.writerows(rows)
    return sout.getvalue()
>>> make_csv([[''], ['']])
'""\r\n""\r\n'
<小时/>

我不知道为什么默认策略对待第一行的方式与其他行不同,但我相信这是一个错误。如果您尝试加载第二行未加引号的 csv 数据,您会注意到输出与最初用于创建 csv 的输入不同:

>>> data = [[''], ['']]
>>> text = make_csv(data)
>>> text
'""\r\n\r\n'
>>> f = io.StringIO(text)
>>> reader = csv.reader(f)
>>> list(reader)
[[''], []]

关于Python csv writer 在空的第一行添加引号,但不在后续行上添加引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49791364/

相关文章:

Python 3.8 IDLE拒绝保存,CTRL+S产生换行符

python-3.x - Python-无法使Corr工作

csv - 来自 CSV 文件的 awk 条件总和

java - 时间序列预测 encog 3 java 从 CSV 读取

python - PyTorch 相当于 Numpy 的 linalg.solve 吗?

python - scikit-learn 中的多输出高斯过程回归

python - 在枚举中显示可选成员

powershell - 使用 Powershell 更改大型 CSV 文件中的分隔符

python - 为反向遗传关系创建序列化器

python - Spotfire 表格可视化换行文本,迭代多个具有相同名称的 vis,并使垂直滚动变得平滑