写入CSV,得到“错误:需要转义”为一个空字符串

balp4ylt  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(68)

当有人发现我在这里做错了什么时,我可能会觉得很愚蠢,但我发现自己无法击败看起来应该是一个简单的错误。
我正在用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

yqyhoc1h

yqyhoc1h1#

这个问题最有可能发生,因为你的description|在它,这是你的csv的插件,以及.因此,csv试图逃避它,但不能因为没有csv.escapechar s设置.示例显示在我的计算机相同的问题-

>>> 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

iih3973s

iih3973s2#

写入NUL字节的唯一可行解决方案是设置escapechar
这是行不通的:

import csv
with open('test.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, quoting=csv.QUOTE_ALL, quotechar='"')
    writer.writerow(['\0'])

字符串
即使你在写的时候使用escapechar,它也不能被读取:

with open('test.csv', newline='') as csvfile:
    reader = csv.reader(csvfile, escapechar='\\')
    for row in reader:
        print(row)

Error: line contains NUL

相关问题