1

再一次,处理字符编码的问题开始困扰着我。我正在打开一个包含 XML 的文本文件并将其导入

import xml.etree.ElementTree as ET
import codecs

f = open('Acta_Diabetol_2008_Jun_29_45(2)_107-127.nxml','r',encoding='cp1252')
myTree = ET.parse( f )
f.close()

of = open( 'Acta_Diabetol_2008_Jun_29_45(2)_107-127.txt','w')      
for elem in myTree.iter('sec'):
    of.write( elem2StringRecurse( elem ) )  #gets mad here
of.close()

给出的错误是

line 197, in <module>
of.write( elem2StringRecurse( elem ) )
File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2265' 
in position 139: character maps to <undefined>

我的问题是两个方面。首先,虽然是一位经验丰富的程序员,但研究这个问题比通常更混乱,因为这在 Python 2 和 3 中的处理方式不同。因此,我不确定错误的含义。我知道罪魁祸首是一些看起来像“a'”的意大利人。 它是在告诉我没有 Unicode 替换吗?

其次,在一般情况下如何防止这种情况? 我正在尝试编写代码来抽取和转储文本文件以进行自然语言处理:来自 XML --> 纯文本。我不能让它因为这样的事情而崩溃;我的意思是我相信我可以手动编辑出有问题的角色,但我不能做到 1000 次......

4

1 回答 1

2

利用

f = open('Acta_Diabetol_2008_Jun_29_45(2)_107-127.nxml', 'r', encoding='utf-8')

of = open('Acta_Diabetol_2008_Jun_29_45(2)_107-127.txt', 'w', encoding='utf-8') 

用 UTF-8 以外的任何方式编码 XML 都是自找麻烦。

查看您的文件(在评论中链接),很明显它是用 ASCII 编码的,它是 UTF-8 的子集(也是 cp1252 的子集,这可能是 Firefox 和 jEdit 猜测它正在使用该编码的原因)。0xff除了ElementTree 似乎正在解析为 Unicode 代码点之外,它还包含几个 Unicode 转义。如果您尝试将其保存回 cp1252 编码的文件,您遇到的错误就是结果。

于 2014-05-22T18:03:33.057 回答