2010-05-02 4 views
2

저는 매우 긴 시트에서 정보를 가져 오는 csv.reader입니다. 나는 그 데이터 세트에 대한 작업을하고있다. 그런 다음 xlwt 패키지를 사용하여 실행 가능한 Excel 파일을 제공하고있다.파이썬 - 유니 코드/아스키 문제 찾기

는 그러나, 나는이 오류를 얻을 : 당신이 모든에

UnicodeDecodeError: 'ascii' codec can't decode byte 0x92 in position 34: ordinal not in range(128)

내 질문에, 내가 정확히 찾을 수있는 방법이 오류가 내 데이터 세트입니다? 또한, 일부 데이터 세트가 위의 오류없이 실행되고 다른 데이터 세트에 문제가 있기 때문에 데이터 세트를 살펴보고 문제가있는 곳을 찾는 코드를 작성할 수 있습니까?

답변

3

대답은 실제로 매우 간단합니다 : 당신이 당신의 파일에서 데이터를 읽 자마자 파일의 인코딩을 사용하여 유니 코드 및 UnicodeDecodeError 예외 처리로 변환 :

try: 
     # decode using utf-8 (use ascii if you want) 
     unicode_data = str_data.decode("utf-8") 
except UnicodeDecodeError, e: 
     print "The error is there !" 

이 많은 문제에서 당신을 저장할 것이다; 멀티 바이트 문자 인코딩에 대해 걱정할 필요가 없으며 외부 라이브러리 (xlwt 포함)는 작성해야 할 경우 올바른 작업을 수행합니다.

파이썬 3.0은 문자열의 인코딩을 지정해야하므로, 지금하는 것이 좋습니다.

유니 코드 인코딩을 지원하는 CSV 리더를 얻기 위해 아래의 질문에 코드 조각을 참조 할 수 있습니다
1

csv 모듈은 유니 코드 및 널 문자를 지원하지 않습니다. 당신이 생각처럼 뭔가를 수행하여 그들을 대체 할 수있을 것 (교체 'UTF-8'당신의 CSV 데이터로 인코딩하는 인코딩) : 당신은 문자의 위치를 ​​찾으려면

import codecs 
import csv 

class AsciiFile: 
    def __init__(self, path): 
     self.f = codecs.open(path, 'rb', 'utf-8') 

    def close(self): 
     self.f.close() 

    def __iter__(self): 
     for line in self.f: 
      # 'replace' for unicode characters -> ?, 'ignore' to ignore them 
      y = line.encode('ascii', 'replace') 
      y = y.replace('\0', '?') # Can't handle null characters! 
      yield y 

f = AsciiFile(PATH) 
r = csv.reader(f) 
... 
f.close() 

하는 또한 다시

import codecs 

lineno = 0 
f = codecs.open(PATH, 'rb', 'utf-8') 
for line in f: 
    for x, c in enumerate(line): 
     if not c.encode('ascii', 'ignore') or c == '\0': 
      print "Character ordinal %s line %s character %s is unicode or null!" % (ord(c), lineno, x) 
    lineno += 1 
f.close() 

, 당신은 내가 유니 코드 문자를 처리 할 수있는 쓴이 CSV 오프너를 사용할 수 있습니다 : 당신은 CSV 모듈에 의해 처리 할 수없는, 당신은 예를 들면 할 수

import codecs 

def OpenCSV(Path, Encoding, Delims, StartAtRow, Qualifier, Errors): 
    infile = codecs.open(Path, "rb", Encoding, errors=Errors) 
    for Line in infile: 
     Line = Line.strip('\r\n') 
     if (StartAtRow - 1) and StartAtRow > 0: StartAtRow -= 1 
     elif Qualifier != '(None)': 
      # Take a note of the chars 'before' just 
      # in case of excel-style """ quoting. 
      cB41 = ''; cB42 = '' 
      L = [''] 
      qMode = False 
      for c in Line: 
       if c==Qualifier and c==cB41==cB42 and qMode: 
        # Triple qualifiers, so allow it with one 
        L[-1] = L[-1][:-2] 
        L[-1] += c 
       elif c==Qualifier: 
        # A qualifier, so reverse qual mode 
        qMode = not qMode 
       elif c in Delims and not qMode: 
        # Not in qual mode and delim 
        L.append('') 
       else: 
        # Nothing to see here, move along 
        L[-1] += c 
       cB42 = cB41 
       cB41 = c 
      yield L 
     else: 
      # There aren't any qualifiers. 
      cB41 = ''; cB42 = '' 
      L = [''] 
      for c in Line: 
       cB42 = cB41; cB41 = c 
       if c in Delims: 
        # Delim 
        L.append('') 
       else: 
        # Nothing to see here, move along 
        L[-1] += c 
      yield L 

for listItem in openCSV(PATH, Encoding='utf-8', Delims=[','], StartAtRow=0, Qualifier='"', Errors='replace') 
    ... 
0

는 오류 메시지와 함께있어 전체 역 추적을 제공하시기 바랍니다 . 우리는 당신이 오류가 발생하는 경우 (또는 xlwt을 사용하여 XLS 파일을 서면으로 "데이터 세트에 일을", CSV 파일을 읽는) 알 때, 우리는 초점을 맞춘 대답을 줄 수 있습니다.

입력 데이터가 모두 구형 ASCII가 아닌 경우도 있습니다. 무엇이 그것을 생산하고, 어떤 인코딩을 하는가? 문제 (반드시 오류가), (안된) 이런 작은 스크립트 시도하는 경우

을 찾는 방법은 다음과 같습니다 당신이 "나쁜"라인의 일부 샘플을 보여 주었다 경우

import sys, glob 
for pattern in sys.argv[1:]: 
    for filepath in glob.glob(pattern): 
     for linex, line in enumerate(open(filepath, 'r')): 
      if any(c >= '\x80' for c in line): 
       print "Non-ASCII in line %d of file %r" % (linex+1, filepath) 
       print repr(line) 

그것은 유용 할 것을 당신 찾을 수 있습니다. 그래서 우리는 인코딩이 무엇인지 판단 할 수 있습니다.

"매우 긴 시트에서 정보를 가져 오기 위해"csv.reader를 사용하는 것에 대해 궁금합니다 - 어떤 종류의 "시트"입니까? XLS 파일을 CSV로 저장하고 CSV 파일을 읽는 중입니까?그렇다면 xlrd을 사용하여 입력 XLS 파일에서 직접 읽을 수 있으며, 인코딩/디코딩 문제를 피하면서 xlwt으로 곧바로 줄 수있는 유니 코드 텍스트를 가져올 수 있습니다.

python-excel.org site에서 자습서를 작성 했습니까?

관련 문제