Python编码转换

3
我写了一个处理带有非ASCII字符的CSV文件的Python脚本,编码为UTF-8。但输出的编码已损坏。因此,从这个输入开始:
"d\xc4\x9bjin hornictv\xc3\xad"

我得到了这个输出:


"d\xe2\x99\xafjin hornictv\xc2\xa9\xc6\xaf"

你能建议编码错误可能来自哪里吗?以前有类似的情况吗?
编辑:我正在使用带有UnicodeWriter类的csv标准库,该类在docs中提供。 我使用的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()

输入数据在此处可用(大文件)。

4
顺便问一下,你尝试使用内置的csv模块了吗?http://docs.python.org/library/csv.html - sinelaw
是的,我正在使用csv标准库。我甚至尝试了http://docs.python.org/library/csv.html上提供的`UnicodeWriter`类。 - Jindřich Mynarz
好的,我希望我的代码有意义。如果没有,请评论。 - Jindřich Mynarz
2个回答

2

似乎在MARCReader构造函数中添加force_utf8 = True参数解决了这个问题:

reader = MARCReader(inputFile, to_unicode = True, force_utf8 = True)

根据源代码的检查(通过inspect),它会执行以下操作:

string.decode("utf-8", "strict")

0
你可以尝试使用UTF-8编码打开该文件:
import codecs
codecs.open('myfile.txt', encoding='utf8')

1
当我用codecs标准库打开输入文件替换常规方式时,我会收到一个错误消息:couldn't find 0x11b in g0=66 g1=69 - Jindřich Mynarz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接