在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的建议相矛盾。在
但现在它起作用了。谢谢大家,尤其是罗布。在
检查fileid对象的类型。我怀疑它是一个unicode对象,正如您所建议的那样。
UnicodeDecodeError
正在被引发,因为在python为输出字符串编码之前(通过print
),隐式解码。在一旦字符串被成功解码(到unicode),您就可以通过使用终端支持的编解码器显式编码来打印它。如果您的终端支持unicode的显示,您可能不需要在输出之前对其进行编码。在
将
utf8
替换为文件系统使用的任何编码(可能是Windows上的latin1?,不确定)。在编辑:重写站点范围内的默认编码被认为是一种黑客行为,因为它a)可能隐藏编程问题,这可能意味着您的代码无法跨python安装进行移植;b)它可能会影响从同一python安装运行的其他代码。此外,明确对字符串的编码和解码可以使以后返回代码时的工作更轻松;您不必记住您修改了站点.py在
相关问题 更多 >
编程相关推荐