Unicode:Python / lxml文件输出不符合预期(打印与写入)



我正在使用下面的代码解析一个 xml 文件:

import lxml
file_name = input('Enter the file name, including .xml extension: ')
print('Parsing ' + file_name)
from lxml import etree
parser = lxml.etree.XMLParser()

tree = lxml.etree.parse(file_name, parser)
root = tree.getroot()
nsmap = {'xmlns': 'urn:tva:metadata:2010'} 

with open(file_name+'.log', 'w', encoding='utf-8') as f:
    for info in root.xpath('//xmlns:ProgramInformation', namespaces=nsmap):
       crid = (info.get('programId'))
       titlex = (info.find('.//xmlns:Title', namespaces=nsmap))
       title = (titlex.text if titlex != None else 'Missing')
       synopsis1x = (info.find('.//xmlns:Synopsis[1]', namespaces=nsmap))             
       synopsis1 = (synopsis1x.text if synopsis1x != None else 'Missing')               
       synopsis1 = synopsis1.replace('r','').replace('n','')
       f.write('{}|{}|{}n'.format(crid, title, synopsis1))    

让我们举一个标题"Přešité bydlení"的例子。 如果我在解析文件时打印标题,它会按预期出现。 然而,当我把它写出来时,它显示为"PÅ eÅ™¡ità bydlené"。

我知道这与编码有关(因为我能够将打印命令更改为使用 UTF-8,并"损坏"输出),但我无法按照我的意愿打印写入的输出。 我看了一下编解码器库,但没有成功。 在 XML 解析器行中使用"编码 = "utf-8"没有任何区别。

如何将写入的输出配置为人类可读?

我以前遇到过各种各样的麻烦。但解决方案相当简单。文档中有一章介绍如何用 unicode 读取和写入文件。这个 Python 演讲对理解这个问题也很有启发性。Unicode 可能很痛苦。不过,如果您开始使用python 3,它会变得容易得多。

import codecs
f = codecs.open('test', encoding='utf-8', mode='w+')
f.write(u'u4500 blah blah blahn')
f.seek(0)
print repr(f.readline()[:1])
f.close()

你的代码看起来不错,所以我认为你的输入是愚蠢的。假设您正在使用 UTF-8 查看器或 shell 查看输出文件,那么我怀疑<?xml中的编码与实际编码不匹配。

这可以解释为什么打印有效但不能写入文件。如果您的 shell/IDE 设置为"ISO-8859-2",并且您的输入 XML 也是"ISO-8859-2",则打印将推出原始编码。

最新更新