UnicodeEncodeError: 'ascii'编解码器无法对位置0-1中的字符进行编码:序号不在范围内(128)

5

我不知道这个错误的具体来源以及如何修复它。我运行这段代码时遇到了这个错误。

 Traceback (most recent call last):
      File "t1.py", line 86, in <module>
        write_results(results)
      File "t1.py", line 34, in write_results
        dw.writerows(results)
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 154, in writerows
        return self.writer.writerows(rows)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

非常感谢您的提问!

我修改了代码后,出现了以下错误:

 File "t1.py", line 88, in <module>
    write_results(results)
  File "t1.py", line 35, in write_results
    dw.writerows(results)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 154, in writerows
    return self.writer.writerows(rows)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

这是改变的内容:
 with codecs.open('results.csv', 'wb', 'utf-8') as f:
        dw = csv.DictWriter(f, fieldnames=fields, delimiter='|')
        dw.writer.writerow(dw.fieldnames)
        dw.writerows(results)
2个回答

4

这个错误是由代码的这一部分引起的:

with open('results.csv', 'w') as f:
    dw = csv.DictWriter(f, fieldnames=fields, delimiter='|')
    dw.writer.writerow(dw.fieldnames)
    dw.writerows(results)

您正在打开一个ASCII文件,然后尝试向其中写入非ASCII数据。我猜想编写该脚本的人在测试期间从未遇到过非ASCII字符,因此从未遇到错误。
但是,如果您查看csv模块的文档,您将看到该模块无法正确处理Unicode字符串(即Beautiful Soup返回的内容),CSV文件必须始终以二进制模式打开,并且只有UTF-8或ASCII是安全的可供写入的格式。
因此,在写入之前,您需要将所有字符串编码为UTF-8。我最初认为仅在写入时对字符串进行编码就足够了,但是Python 2中的csv模块仍无法处理Unicode字符串。因此,我想没有其他方法,只能显式地对每个字符串进行编码:
parse_results()中,更改以下行:
results.append({'url': url, 'create_date': create_date, 'title': title})

to

results.append({'url': url, 'create_date': create_date, 'title': title.encode("utf-8")})

可能已经足够了,因为我不希望URL或日期包含非ASCII字符。


我修改了代码,但是仍然出现相同的错误。你能否请检查我的更新帖子?你自己能够运行这个程序而没有错误吗? - Mona Jalal
嗯,这是同样的错误,但它发生在不同的行上。如果你只是交换了这两个代码块,行号应该保持不变 - 你有改动其他什么吗? - Tim Pietzcker
我是通过谷歌搜索来到这里的,这个更改为我解决了错误。有趣的是,对我来说,“ ”导致Python出现问题。这是否是预期的? - user763410
@user763410:字面文本&nbsp;应该没问题,但是由该实体编码的字符超出了ASCII范围,因此实际上可能会导致错误。 - Tim Pietzcker

0

这应该可以工作。对我有效。代码片段

import csv
import sys
reload(sys)
sys.setdefaultencoding('utf8')
data = [["a", "b", u'\xe9']]
with open("output.csv", "w") as csv_file:
    writer = csv.writer(csv_file, quoting=csv.QUOTE_ALL)
    writer.writerows(data)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接