ascii' 编码无法编码字符,位置 * 的 ord 不在范围内 (128)

10 投票
2 回答
12997 浏览
提问于 2025-04-17 18:48

在StackOverflow上有一些讨论,但我找不到一个完整的解决方案。

我通过urllib的读取功能收集了大量的文本数据,并把这些数据存储在pickle文件里。

现在我想把这些数据写入一个文件。

在写入的时候,我遇到了类似下面的错误:

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128)

而且很多数据都丢失了。

我想urllib读取的数据是字节数据。

我尝试过:

   1. text=text.decode('ascii','ignore')
   2. s=filter(lambda x: x in string.printable, s)
   3. text=u''+text
      text=text.decode().encode('utf-8')

但还是遇到了类似的错误。

有人能给我指个正确的解决办法吗?另外,使用codecs.strip会有效吗?我不介意如果冲突的字节不写入文件作为字符串,所以数据丢失是可以接受的。

2 个回答

9

你的数据是 unicode 数据。要把它写入文件,可以使用 .encode() 方法:

text = text.encode('ascii', 'ignore')

不过,这样做会把所有不是 ASCII 的内容都去掉。也许你想用更合适的编码,比如 UTF-8 呢?

你可能想了解一下 Python 和 Unicode 的相关知识:

11

你可以通过模块里的smart_str来实现这个功能。试试这个:

from django.utils.encoding import smart_str, smart_unicode

text = u'\u2019'
print smart_str(text)

你可以通过以管理员身份打开命令行窗口,然后运行这个命令来安装Django:

pip install Django

撰写回答