当有人发现我在这里做错了什么时,我可能会觉得自己很傻,但我发现自己无法打败看起来应该是一个简单错误的东西。
我正在用Python为CSV编写一些数据。我想写的东西之一是整数的list
。在将列表写入文件之前,我将列表写入字符串:
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)
显示它是一个空白字符串,与前面的字符串相同。item p81
没有p81
(只是一个空字符串),但它前面的项有一个description
。
发布于 2015-08-20 01:12:41
这个问题很可能是因为您的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
一种解决办法是提供一个转义器,以便可以转义。例子-
writer = csv.writer(f, quoting=csv.QUOTE_NONE, delimiter='|', quotechar='',escapechar='\\') #Or any other appropriate escapechar
或者另一个解决方法是在尝试编写描述之前删除描述中的|
,如果您在description字段中并不真正需要它-
description = description.replace('|','')
或者您可以引用所有字段,方法是使用csv.QUOTE_ALL
而不是csv.QUOTE_NONE
来提供有效的quotechar
。
https://stackoverflow.com/questions/32107790
复制相似问题