【问题标题】:Python csv writer adds quotes on empty first line, but not subsequent linesPython csv writer 在空的第一行添加引号,但不添加后续行
【发布时间】:2018-04-12 08:17:37
【问题描述】:

我正在尝试使用 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()

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

>>> 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 版本中

【问题讨论】:

  • QUOTE_MINIMAL 的值是多少
  • 应该是csv.QUOTE_MINIMAL
  • 无法复制。我得到 2 行引用:'""\r\n""\r\n'
  • @zipa 谢谢,改了
  • @Jean-FrançoisFabre 哪个 python 版本?我正在使用 3.6.3

标签: python python-3.x csv


【解决方案1】:

您可以通过设置不同的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'

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

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

【讨论】:

  • 当然可以,但是这些都不是我想要的其他输入。如果这是 QUOTE_MINIMAL 的预期行为,那么它至少是未记录且不直观的。
  • @yamad 为什么你关心输入的引用方式?这不像引号在 csv 中有任何区别(除了空字符串和包含逗号的字符串,但你明白了)。只要 csv 模块正确读取您的文件,引号有什么关系?
  • 因为输出输入到一个我无法控制的挑剔程序中,而且它对接受的格式不是很聪明
  • @yamad 好吧,您并没有真正向我们提供有关哪些字段应该被引用和哪些不应该被引用的任何信息,因此无法真正帮助您。但我怀疑 csv 模块是否具有您需要的内置功能。您可能必须编写自己的 csv 编写器(或至少继承现有的 csv.writer)。
猜你喜欢
  • 2014-04-24
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 2018-12-16
  • 1970-01-01
  • 2019-10-05
相关资源
最近更新 更多