希望Python创建一个UTF8文件,得到一个ANSI文件。为什么?

2024-06-16 13:25:31 发布

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

我有以下功能:

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文本,这是不可接受的。

我相信如果用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得到了同样的损坏字符。


Tags: 文件intoken编码isocorpusfilenameutf