使用Python从xml数据库中删除非Unicode字符

时间:2015-04-07 23:42:49

标签: python python-3.x unicode

所以我有一个9000行xml数据库,保存为txt,我想在python中加载,所以我可以做一些格式化并删除不必要的标签(我只需要一些标签,但是有很多不必要的信息)使其可读。但是,我得到一个UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 608814: character maps to <undefined>,我认为这意味着该程序遇到了非Unicode字符。我非常肯定这些字符对程序并不重要(我要查找的数据都是纯文本,没有特殊符号),所以当我无法阅读时,如何从txt文件中删除所有这些内容文件没有得到UnicodeDecodeError

2 个答案:

答案 0 :(得分:2)

一个简单的解决方法是自己解码文件中的字节并指定错误处理。 EG:

for line in somefile:
    uline = line.decode('ascii', errors='ignore')

这会将该行转换为Unicode对象,其中任何非ascii字节都已被删除。这不是一般推荐的方法 - 理想情况下,您希望使用适当的解析器处理XML,或者至少知道文件的编码并适当地打开它(具体细节取决于您的Python版本)。但是,如果你完全确定你只关心ascii字符,这是一个简单的后备。

答案 1 :(得分:2)

该错误表明您在未指定显式字符编码的情况下使用open()函数。在这种情况下使用locale.getpreferredencoding(False)(例如cp1252)。该错误表明它不是输入的适当编码。

An xml document may contain a declaration at the very begining that specifies the encoding used explicitly. Otherwise the encoding is defined by BOM or it is utf-8.如果您复制粘贴并保存文件没有弄乱编码,并且您没有看到<?xml version="1.0" encoding="iso-8859-1" ?>之类的行,那么请使用{{utf-8打开文件1}}:

with open('input-xml-like.txt', encoding='utf-8', errors='ignore') as file:
    ...

如果输入是实际的XML,那么只需将其传递给XML解析器:

import xml.etree.ElementTree as etree

tree = etree.parse('input.xml')