Python编码转换
我写了一个Python脚本,用来处理包含非ASCII字符的CSV文件,这些文件是用UTF-8编码的。不过,输出的编码出现了问题。所以,在输入中是这样的:
"d\xc4\x9bjin hornictv\xc3\xad"
而我得到的输出是这样的:
"d\xe2\x99\xafjin hornictv\xc2\xa9\xc6\xaf"
你能帮我找找编码错误可能出在哪里吗?你之前见过类似的情况吗?
补充说明:我使用的是csv
标准库,里面有UnicodeWriter
这个类,具体可以参考文档。我用的是Python 2.6.6版本。
补充说明2:这是重现这个问题的代码:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import csv
from pymarc import MARCReader # The pymarc package available PyPI: http://pypi.python.org/pypi/pymarc/2.71
from UnicodeWriter import UnicodeWriter # The UnicodeWriter from: http://docs.python.org/library/csv.html
def getRow(tag, record):
if record[tag].is_control_field():
row = [tag, record[tag].value()]
else:
row = [tag] + record[tag].subfields
return row
inputFile = open("input.mrc", "r")
outputFile = open("output.csv", "wb")
reader = MARCReader(inputFile, to_unicode = True)
writer = UnicodeWriter(outputFile, delimiter = ",", quoting = csv.QUOTE_MINIMAL)
for record in reader:
if bool(record["001"]):
tags = [field.tag for field in record.get_fields()]
tags.sort()
for tag in tags:
writer.writerow(getRow(tag, record))
inputFile.close()
outputFile.close()
输入数据可以在这里找到(文件比较大)。
2 个回答
0
你可以试着用UTF-8编码来打开这个文件:
import codecs
codecs.open('myfile.txt', encoding='utf8')
2
看起来在创建 MARCReader
的时候加上 force_utf8 = True
这个参数就解决了问题:
reader = MARCReader(inputFile, to_unicode = True, force_utf8 = True)
根据对源代码的检查(通过 inspect
),它做的事情大概是:
string.decode("utf-8", "strict")