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

时间:2018-04-12 08:17:37

标签: 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()

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

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

1 个答案:

答案 0 :(得分:2)

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