理解Python和unicodedecodede中的unicode

2024-06-26 00:12:11 发布

您现在位置:Python中文网/ 问答频道 /正文

在Mac上的Python2.7中,我打印的是nltk的PlaintextCorpusReader检索到的文件名:

infobasecorpus = PlaintextCorpusReader(corpus_root, '.*\.txt')
for fileid in infobasecorpus.fileids():
    print fileid

并得到UnicodeDecodeError: 'ascii', '100316-N1-The \xc2\xa3250bn cost of developing.txt', 14, 15, 'ordinal not in range(128)',因为文件名中有£符号。在

据我所知,fileid是一个unicode字符串,在打印之前,我需要将其编码为默认编码,默认编码是ASCII。在

如果我使用print fileid.encode('ascii', 'ignore'),我会得到相同的错误。在

如果我通过在site.py(per this advice)中设置encoding = "utf-8"来更改默认编码,它就可以工作了。在

谁能告诉我: (a) 为什么encode失败了 (b) 为什么encoding起作用并且 (c) 如果我做错了该怎么办?(例如,this描述了将默认编码设置为“丑陋的黑客行为”,这会导致字符串的滥用和错误代码的创建。)

(免责声明:Python新手,非常感谢您的耐心等待,如果这是显而易见的)

在=========================================== 更新回复Rob:

Rob,这是测试代码的全文:

^{pr2}$

我已经将默认编码设置回ascii并运行它。在

print fileid.encode('ascii')在文件名中的£上仍然失败。在

在=========================================== 最后一次更新以防对其他人有帮助。在

我需要写:

fileid = fileid.decode('utf8')
print fileid.encode('ascii', 'ignore')

但是text = nltk.Text(infobasecorpus.words(fileid))如果输入<type 'unicode'>字符串,则会阻塞,这似乎与在进一步处理之前立即将所有内容转换为unicode的建议相矛盾。在

但现在它起作用了。谢谢大家,尤其是罗布。在


Tags: 字符串intxt编码文件名asciiunicodethis
1条回答
网友
1楼 · 发布于 2024-06-26 00:12:11

检查fileid对象的类型。我怀疑它是一个unicode对象,正如您所建议的那样。UnicodeDecodeError正在被引发,因为在python为输出字符串编码之前(通过print),隐式解码。在

一旦字符串被成功解码(到unicode),您就可以通过使用终端支持的编解码器显式编码来打印它。如果您的终端支持unicode的显示,您可能不需要在输出之前对其进行编码。在

infobasecorpus = PlaintextCorpusReader(corpus_root, '.*\.txt')
for fileid in infobasecorpus.fileids():
    fileid = fileid.decode('utf8') ## fileid is now a unicode object
    print fileid.encode('utf8')

utf8替换为文件系统使用的任何编码(可能是Windows上的latin1?,不确定)。在

编辑:重写站点范围内的默认编码被认为是一种黑客行为,因为它a)可能隐藏编程问题,这可能意味着您的代码无法跨python安装进行移植;b)它可能会影响从同一python安装运行的其他代码。此外,明确对字符串的编码和解码可以使以后返回代码时的工作更轻松;您不必记住您修改了站点.py在

相关问题 更多 >