Python编码转换

3 投票
2 回答
2130 浏览
提问于 2025-04-16 10:35

我写了一个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")

撰写回答