【发布时间】:2011-12-24 22:06:25
【问题描述】:
我有以下功能:
def storeTaggedCorpus(corpus, filename):
corpusFile = codecs.open(filename, mode = 'w', encoding = 'utf-8')
for token in corpus:
tagged_token = '/'.join(str for str in token)
tagged_token = tagged_token.decode('ISO-8859-1')
tagged_token = tagged_token.encode('utf-8')
corpusFile.write(tagged_token)
corpusFile.write(u"\n")
corpusFile.close()
当我执行它时,出现以下错误:
(...) in storeTaggedCorpus
corpusFile.write(tagged_token)
File "c:\Python26\lib\codecs.py", line 691, in write
return self.writer.write(data)
File "c:\Python26\lib\codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
所以我去调试它,发现创建的文件被编码为 ANSI,而不是corpusFile = codecs.open(filename, mode = 'w', encoding = 'utf-8') 中声明的 UTF-8。如果
corpusFile.write(tagged_token) 被删除,这个函数将(显然)工作,文件将被编码为 ANSI。相反,如果我删除tagged_token = tagged_token.encode('utf-8'),它也会起作用,但是生成的文件将具有编码“ANSI as UTF-8”(???)并且拉丁字符将被破坏。由于我正在分析 pt-br 文本,因此这是不可接受的。
我相信如果 corpusFile 以 UTF-8 格式打开,一切都会正常工作,但我无法让它工作。我在网上搜索过,但我发现的关于 Python/Unicode 的所有内容都涉及其他内容……那么为什么这个文件总是以 ANSI 结尾?我在 Windows 7 x64 中使用 Python 2.6,这些文件编码是从 Notepad++ 通知的。
编辑——关于corpus参数
我不知道corpus 字符串的编码。它是由PlaintextCorpusReader.tag() 方法从NLTK 生成的。根据 Notepad++,原始语料库文件以 UTF-8 编码。 tagged_token.decode('ISO-8859-1') 只是一个猜测。我尝试将其解码为 cp1252,并从 ISO-8859-1 中获得了相同的损坏字符。
【问题讨论】:
-
什么是“ANSI 编码”文件?
-
我手头没有 Windows 安装(而且问题几乎可以肯定源于 Windows 奇怪的文件处理),但您应该使用模式
'w', encoding='utf8'打开文件并写入unicode对象(decode的结果)或以'wb'(无编码)模式打开文件并写入str对象(encode的结果)。 -
首先,
token真的是在ISO-8859-1中编码的 str 吗? -
@sarnold 检查this.
-
@PetrViktorin 似乎是这样。原始代码没有这一行,它在下一行以
UnicodeDecodeError崩溃。加入这条线后,它就不再抱怨了。
标签: python windows unicode utf-8 python-2.6