ascii' 编码无法编码字符,位置 * 的 ord 不在范围内 (128)
在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 的相关知识:
每个软件开发者必须了解的 Unicode 和字符集的基本知识(没有借口!),作者是 Joel Spolsky
实用的 Unicode 介绍,作者是 Ned Batchelder
11
你可以通过smart_str
来实现这个功能。试试这个:
from django.utils.encoding import smart_str, smart_unicode
text = u'\u2019'
print smart_str(text)
你可以通过以管理员身份打开命令行窗口,然后运行这个命令来安装Django:
pip install Django