如何用UTF8剥离ou编写ElementTree

2024-10-01 07:27:16 发布

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

我已经生成了一个巨大的(50MB)XML元素树,在原始数据中的某个地方,有一些UTF-8字母没有被剥离出来。元素树.write而且.tostring似乎被unicode阻塞了,尽管tostring中有一个“encoding='UTF-8'”选项。文档相当有限,我甚至不确定tostring是否对UTF-8友好(查看源代码)。在

所以我的问题是,我如何从整个元素树中去掉任何非ascii字符,这样我就可以把这个怪物写到磁盘上(生成这个怪物花了8个小时)?我暂时把它腌了。我还对大多数数据使用了一个名为latin1_to_ascii的函数:

def latin1_to_ascii(unicrap):
        """
        This takes a UNICODE string and replaces Latin-1 characters with
        something equivalent in 7-bit ASCII. Anything not converted is deleted.
    #the unicode hammer approach: http://code.activestate.com/recipes/251871-latin1-to-ascii-the-unicode-hammer/
    """
    xlate={0xc0:'A', 0xc1:'A', 0xc2:'A', 0xc3:'A', 0xc4:'A', 0xc5:'A',
            0xc6:'Ae', 0xc7:'C',
            0xc8:'E', 0xc9:'E', 0xca:'E', 0xcb:'E',
            0xcc:'I', 0xcd:'I', 0xce:'I', 0xcf:'I',
            0xd0:'Th', 0xd1:'N',
            0xd2:'O', 0xd3:'O', 0xd4:'O', 0xd5:'O', 0xd6:'O', 0xd8:'O',
            0xd9:'U', 0xda:'U', 0xdb:'U', 0xdc:'U',
            0xdd:'Y', 0xde:'th', 0xdf:'ss',
            0xe0:'a', 0xe1:'a', 0xe2:'a', 0xe3:'a', 0xe4:'a', 0xe5:'a',
            0xe6:'ae', 0xe7:'c',
            0xe8:'e', 0xe9:'e', 0xea:'e', 0xeb:'e',
            0xec:'i', 0xed:'i', 0xee:'i', 0xef:'i',
            0xf0:'th', 0xf1:'n',
            0xf2:'o', 0xf3:'o', 0xf4:'o', 0xf5:'o', 0xf6:'o', 0xf8:'o',
            0xf9:'u', 0xfa:'u', 0xfb:'u', 0xfc:'u',
            0xfd:'y', 0xfe:'th', 0xff:'y',
            0xa1:'!', 0xa2:'{cent}', 0xa3:'{pound}', 0xa4:'{currency}',
            0xa5:'{yen}', 0xa6:'|', 0xa7:'{section}', 0xa8:'{umlaut}',
            0xa9:'{C}', 0xaa:'{^a}', 0xab:'<<', 0xac:'{not}',
            0xad:'-', 0xae:'{R}', 0xaf:'_', 0xb0:'{degrees}',
            0xb1:'{+/-}', 0xb2:'{^2}', 0xb3:'{^3}', 0xb4:"'",
            0xb5:'{micro}', 0xb6:'{paragraph}', 0xb7:'*', 0xb8:'{cedilla}',
            0xb9:'{^1}', 0xba:'{^o}', 0xbb:'>>', 
            0xbc:'{1/4}', 0xbd:'{1/2}', 0xbe:'{3/4}', 0xbf:'?',
            0xd7:'*', 0xf7:'/',0x92:'a'
            }
    r = ''
    for i in unicrap:
            if xlate.has_key(ord(i)):
                    r += xlate[ord(i)]
            elif ord(i) >= 0x80:
                    pass
            else:
                    r += str(i)
    return r

“nuclear option”函数只对字符串有效,现在我在一个元素中有了数据,我似乎无法删除我错过的内容。在


Tags: to数据函数in元素asciiunicodeutf
3条回答

你需要解释“原始数据中有一些UTF-8字母没有被去掉”——比如什么是“UTF-8字母”,以及为什么要去掉它们。在

如果你能解释一下元素树.write而且,tostring似乎被unicode“的意思扼杀了。请编辑您的问题以显示完整的错误消息和回溯。在

为什么要使用该函数将unicode转换成ASCII?这仅仅是为了克服你所面临的问题吗?在

很可能您正在将用UTF-8编码的str对象提供给ElementTree。别那样做。给它提供unicode对象,它就可以工作了:

>>> e = et.Element('root')
>>> e.text = u''.join(unichr(i) for i in xrange(0x400, 0x408))
>>> e.text
u'\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407'

如果您必须有ASCII输出(您正在通过7位宽通道通信?)公司名称:

^{pr2}$

UTF-8工程:

>>> et.tostring(e, 'UTF-8')
"<?xml version='1.0' encoding='UTF-8'?>\n<root>\xd0\x80\xd0\x81\xd0\x82\xd0\x83\xd0\x84\xd0\x85\xd0\x86\xd0\x87</root>"

您应该使用ElementTree.write method来编写文件,而不是使用“tostring”;这样可以节省双重处理。在

在我看来,问题更可能是你正在处理的输出文件的编码问题。你能提供更多的代码来说明你是如何写出来的吗?我不明白ElementTree.write()和{}怎么会被它噎住。在

我将再次运行该进程,在树创建期间将输入字符串解码为unicode。八个小时可能是很长的时间,但是你可以做其他事情,而不是等待别人的内存补丁。在

在继续之前,请确保对数据的一小部分进行测试,以确认代码可以正常工作。在

相关问题 更多 >