【问题标题】:Writing to CSV, getting "Error: need to escape" for a blank string写入 CSV,得到一个空白字符串的“错误:需要转义”
【发布时间】:2015-11-13 11:28:57
【问题描述】:

当有人发现我在这里做错了什么时,我可能会感到非常愚蠢,但我发现自己无法克服看似简单的错误。

我正在使用 Python 将一些数据写入 CSV。我想写的一件事是整数的list。我在将join列表写入文件之前将其转换为字符串:

with open('publishers.csv', 'wb') as f:
    writer = csv.writer(f, quoting=csv.QUOTE_NONE, delimiter='|', quotechar='')
    for item in big_list_of_objects:
        description = item.description
        number_list = item.number_list
        formatted_numbers = "-".join(number_list)
        writer.writerow([
            description,
            formatted_numbers
            ])

number_list 中可能包含从零到一大堆数字的任何地方。如果它是一个空列表,join 只是将formatted_numbers 设置为等于一个空字符串。如果它不是一个空列表,我会得到一个由连字符连接的整数组成的字符串。

number_list = [1,2,34,12]
formatted_numbers = '1-2-34-12'

number_list = []
formatted_numbers = ''

反正就是这样。实际上,发生的情况是前五行写入成功然后我得到:

File "<console>", line 1, in <module>
  File "/path/path/path.py", line 500, in offending_function
    formatted_numbers
Error: need to escape, but no escapechar set

现在在这种特殊情况下,成功写入的前五行有一个空的number_list。持续崩溃的行有一个空的number_list。在这一行的number_list 之前或之后写入的值没有什么奇怪的。当这个错误出现时,formatted_numbers 被写入并没有什么奇怪的 - 我扔进了一个 print 语句来调试,它只是一个空字符串,就像它之前的五个一样。

谁能帮我弄清楚我可能在哪里出错了?


编辑:我添加了这些打印语句:

with open('publishers.csv', 'wb') as f:
    writer = csv.writer(f, quoting=csv.QUOTE_NONE, delimiter='|', quotechar='')
    for item in big_list_of_objects:
        description = item.description
        print "Description for %r is %r" % (item,description)
        number_list = item.number_list
        print "Now formatting %r for %r" % (number_list,item)
        formatted_numbers = "-".join(number_list)
        print repr(formatted_numbers)
        writer.writerow([
            description,
            formatted_numbers
            ])

结果:

Description for 'p89' is u''
Now formatting '' for 'p89'
''
Description for 'p88' is u''
Now formatting '' for 'p88'
''
Description for 'p83' is u''
Now formatting '' for 'p83'
''
Description for 'p82' is u'in-tr-t91411'
Now formatting '' for 'p82'
''
Description for 'p81' is u''
Now formatting '' for 'p81'
''
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/path/path/path.py", line 501, in offending_function
    formatted_numbers
Error: need to escape, but no escapechar set

p81 未写入 CSV - 这是发生崩溃的地方。但是,如您所见,print repr(formatted_numbers) 显示它是一个与之前相同的空白字符串。 p81 项没有 description(只是一个空白字符串),但它前面的项 description

【问题讨论】:

  • 你在哪一行得到了这个错误?
  • 错误发生在formatted_numbers 被输入writer.writerow() 的那一行。我已经编辑了第一个代码 sn-p 以反映我最终使用的格式,现在回溯应该更有意义。
  • 出错时能否打印出该行的描述?

标签: python csv


【解决方案1】:

这个问题很可能是因为您的description 中包含|,这也是您的csv 的分隔符。因此, csv 试图逃避它,但因为没有设置 csv.escapechars 而不能。在我的计算机上显示相同问题的示例 -

>>> description = 'asda|sd'
>>> formatted_numbers = ''
>>> with open('a.csv','w') as f:
...     writer = csv.writer(f, quoting=csv.QUOTE_NONE, delimiter='|', quotechar='')
...     writer.writerow([
...             description,
...             formatted_numbers
...             ])
...
Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
_csv.Error: need to escape, but no escapechar set

一个解决方法是提供一个 escapechar 以便它可以被转义。示例 -

writer = csv.writer(f, quoting=csv.QUOTE_NONE, delimiter='|', quotechar='',escapechar='\\')    #Or any other appropriate escapechar

或者另一种解决方法是在尝试编写之前删除描述中的|,如果您在描述字段中确实不需要它 -

description = description.replace('|','')

或者您可以引用所有字段,使用 csv.QUOTE_ALL 而不是 csv.QUOTE_NONE 作为提供有效的 quotechar

【讨论】:

  • 在脚本中添加了一些打印语句并在结果中进行了编辑。周围的任何字段中都没有竖线字符。
  • 尝试将 escapechar 设置为 something ,就像我在我的示例中所做的那样,让完整的 csv 被写出,然后检查用 escape char 写出的内容?
  • 哇哦,我现在明白问题所在了。有人在其中一个描述中偷偷回车,这使得编码非常不愉快。将.encode('utf-8') 添加到受影响的字段就可以了。由于您建议添加转义字符并检查 CSV,我发现了这一点。我对 CSV 模块非常陌生,并没有考虑到这一点。谢谢!
  • 非常感谢。我遇到了一个不同的问题:每当我的字符串中有引号时,我的 csv 文件就会用双引号保存。现在它已经修复了。 :)
  • 注意:TypeError: "escapechar" 必须是 1 个字符的字符串,所以 '\\' 不起作用。
猜你喜欢
  • 2021-05-10
  • 2021-12-31
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
相关资源
最近更新 更多