Преобразование кодировки Python - PullRequest
3 голосов
/ 25 января 2011

Я написал скрипт на Python, который обрабатывает файлы CSV с не-ascii символами, закодированными в 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 ]

2 голосов
/ 25 января 2011

Кажется, добавление аргумента force_utf8 = True в конструктор MARCReader решило проблему:

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

Согласно проверке исходного кода (через inspect) он делает что-то вроде:

string.decode("utf-8", "strict")
0 голосов
/ 25 января 2011

Вы можете попробовать открыть файл в кодировке UTF-8:

import codecs
codecs.open('myfile.txt', encoding='utf8')
...