写入CSV,获取空白字符串的"错误:需要转义"

sou*_*eux 17 python csv

当有人发现我在这里做错了什么时,我可能会感到非常愚蠢,但我发现自己无法打败看起来应该是一个简单的错误.

我正在用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
            ])
Run Code Online (Sandbox Code Playgroud)

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

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

number_list = []
formatted_numbers = ''
Run Code Online (Sandbox Code Playgroud)

无论如何,那是个主意.实际上,发生的事情是前五行成功写入然后我得到:

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
Run Code Online (Sandbox Code Playgroud)

现在在这种特殊情况下,成功写入的前五行为空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
            ])
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

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

Ana*_*mar 22

这个问题最有可能发生,因为你的description内容|也是如此,这也是你的csv的分隔符.因此,csv试图逃避它,但不能因为没有csv.escapechar设置.在我的电脑中显示相同问题的示例 -

>>> 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
Run Code Online (Sandbox Code Playgroud)

一个解决方案是提供一个escapechar,以便它可以被转义.示例 -

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

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

description = description.replace('|','')
Run Code Online (Sandbox Code Playgroud)

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