当有人发现我在这里做错了什么时,我可能会觉得很愚蠢,但我发现自己无法击败看起来应该是一个简单的错误。
我正在用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
。
2条答案
按热度按时间yqyhoc1h1#
这个问题最有可能发生,因为你的
description
有|
在它,这是你的csv的插件,以及.因此,csv试图逃避它,但不能因为没有csv.escapechar
s设置.示例显示在我的计算机相同的问题-字符串
一个解决办法是提供一个escapechar,这样它就可以逃脱。例如-
型
或者另一个修复方法是在尝试编写描述之前删除描述中的
|
,如果您在描述字段中确实不需要它-型
或者,您可以使用
csv.QUOTE_ALL
而不是csv.QUOTE_NONE
来引用所有字段,以提供有效的quotechar
。iih3973s2#
写入NUL字节的唯一可行解决方案是设置
escapechar
。这是行不通的:
字符串
即使你在写的时候使用
escapechar
,它也不能被读取:型