【发布时间】:2015-04-13 18:19:35
【问题描述】:
我有一个chardet 认为可能是windows1252 的文件:
$ chardetect pub5.xml
pub5.xml: windows-1252 with confidence 0.73
当我尝试在 Python 中读取它然后将其写入 CSV 文件时,出现错误:
str = row[r].decode('windows-1252').encode('utf8')
我得到的错误是这样的:
Traceback (most recent call last):
File "main.py", line 10, in <module>
csv_filename='output/studies.csv'
File "parser.py", line 15, in parse_data_to_csv
self._write_csv_file(csv_header, csv_filename, xml_files)
File "parser.py", line 114, in _write_csv_file
str = row[r].decode('windows-1252').encode('utf8')
File "/Users/me/.virtualenvs/test/lib/python2.7/encodings/cp1252.py", line 15, in decode
return codecs.charmap_decode(input,errors,decoding_table)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 6: ordinal not in range(128)
我不明白为什么需要ascii 编解码器来解码来自windows-1252 的内容。有人可以帮忙吗?
失败的字符串是:aa Mixéu 2002。相同的代码在 Python 控制台中运行正常:
str = 'aa Mixéu 2002'
str.decode('windows-1252').encode('utf8')
'aa Mix\xc3\x83\xc2\xa9u 2002'
我正在使用 lxml 设置 row[r] 的值,我不知道这是否相关:
studies = root.findall('.//STUDY')
for study_wrapper in studies:
row = {}
row['study_name'] = study_wrapper.get('NAME')
也许 lxml 以某种方式将其设置为 ASCII?
更新:想通了:
try:
row[r] = row[r].encode('utf-8')
except UnicodeDecodeError:
row[r] = row[r].decode('ISO-8859-1').encode('utf-8')
似乎有些传入的字符串是 UTF8 格式,有些不是 - 来自同一个文件!
【问题讨论】:
-
print repr(row[r])在您尝试解码/编码之前... -
lxml为您将输入解码为 Unicode,您无需自己解码。 -
这里也不需要使用chardet; XML 文档在它们的标题中说明它们在
<?xml ...?>前导码中被编码成什么编解码器,这就是为什么lxml可以首先自动解码数据的原因;如果缺少前导码,则默认从 UTF-8 解码。 -
我正在重新打开这个。无论如何,他在问题末尾添加的这个人的解决方案直接陷入了灾难。
标签: python