首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >写入CSV,获取空字符串的“错误:需要转义”

写入CSV,获取空字符串的“错误:需要转义”
EN

Stack Overflow用户
提问于 2015-08-20 00:37:52
回答 1查看 69K关注 0票数 29

当有人发现我在这里做错了什么时,我可能会觉得自己很傻,但我发现自己无法打败看起来应该是一个简单错误的东西。

我正在用Python为CSV编写一些数据。我想写的东西之一是整数的list。在将列表写入文件之前,我将列表写入字符串:

代码语言:javascript
运行
复制
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设置为等于空字符串。如果不是空列表,我会得到一个由连字符连接的向上整数组成的字符串。

代码语言:javascript
运行
复制
number_list = [1,2,34,12]
formatted_numbers = '1-2-34-12'

number_list = []
formatted_numbers = ''

不管怎样,这就是我的想法。实际上,最初的五行写入成功,然后我得到:

代码语言:javascript
运行
复制
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语句进行调试,它只是一个空字符串,就像它前面的五个。

有人能帮我找出我哪里可能出了问题吗?

编辑:我添加了以下打印语句:

代码语言:javascript
运行
复制
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
            ])

结果:

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-20 01:12:41

这个问题很可能是因为您的description中有|,这也是您的csv的分隔符。因此,csv试图转义它,但不能,因为没有设置csv.escapechars。在我的电脑上显示同样的问题-

代码语言:javascript
运行
复制
>>> 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

一种解决办法是提供一个转义器,以便可以转义。例子-

代码语言:javascript
运行
复制
writer = csv.writer(f, quoting=csv.QUOTE_NONE, delimiter='|', quotechar='',escapechar='\\')    #Or any other appropriate escapechar

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

代码语言:javascript
运行
复制
description = description.replace('|','')

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

票数 43
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32107790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档