2011-01-25 6 views
3

UTF-8로 인코딩 된 비 ASCII 문자로 CSV 파일을 처리하는 Python 스크립트를 작성했습니다. 그러나 출력의 인코딩이 깨졌습니다. 따라서, 입력이에서 :파이썬 인코딩 변환

"d\xc4\x9bjin hornictv\xc3\xad" 

I 출력이 얻을 :

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

을 사용하면 인코딩 오류가 어디에서 올 수도 제안 할 수 있습니다? 이전에 비슷한 행동을 보았습니까?

편집 : 나는 docs에 등장하는 UnicodeWriter 클래스의 표준 라이브러리 인 csv을 사용하고 있습니다. Python 버전 2.6.6을 사용합니다.

EDIT 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() 

입력 데이터 available here (큰 파일)이다.

+4

그건 그렇고, 내장 csv 모듈을 사용해 보셨습니까? http://docs.python.org/library/csv.html – sinelaw

+0

Python 버전이란 무엇입니까? – Skurmedel

+0

예, 저는'csv' 표준 라이브러리를 사용하고 있습니다. 그리고 http://docs.python.org/library/csv.html에서 사용 가능한'UnicodeWriter' 클래스를 시도해 보았습니다. –

답변

2

그것은 MARCReader 생성자에 force_utf8 = True 인수를 추가 보인다는 문제를 해결을 소스 코드 (inspect 경유) :

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

당신은 UTF-8 인코딩을 사용하여 파일을 열려고 할 수의 검사에 따르면

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

:

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

입력 파일을'codecs' 표준 라이브러리로 열어 정규 파일로 바꾸면''g0 = 66 g1 = 69'에서 0x11b를 찾을 수 없습니다. '라는 오류가 발생합니다. –