2016-06-28 4 views
2

UnicodeDecodeError가 발생한 위치를 어떻게 알 수 있습니까? here 이상의 자료를 발견했으며이를 아래에서 구현하려고했습니다. 하지만 난 그냥 오류가 발생합니다 NameError: name 'err' is not definedUnicodeDecodeError가 발생한 위치를 얻는 방법은 무엇입니까?

인터넷을 통해 이미 여기저기서 StackOverflow를 검색했지만 사용 방법을 찾을 수 없습니다. 파이썬 워드 프로세서에서는이 특별한 예외가 시작 속성을 가지고 있으므로 가능해야한다고 말합니다.

감사합니다.

data = buffer + data 
    try: 
     data = data.decode("utf-8") 
    except UnicodeDecodeError: 
     #identify where did the error occure? 
     #chunk that piece off -> copy troubled piece into buffer and 
     #decode the good one -> then go back, receive the next chunk of 
     #data and concatenate it to the buffer. 

     buffer = err.data[err.start:] 
     data = data[0:err.start] 
     data = data.decode("utf-8") 
+0

투표에 당신은 as 키워드로 예외 객체를 취득하고, start 속성을 사용할 수 있습니다 닫기로 사소한 '사촌 대답은 필수적인 구문 세부 사항입니다. 나중에 참조 할 때 유용 할 수 있습니다. –

답변

4

해당 정보는 예외 자체에 저장됩니다.

while True: 
    try: 
     data = data.decode("utf-8") 
    except UnicodeDecodeError as e: 
     data = data[:e.start] + data[e.end:] 
    else: 
     break 
+0

은 간단합니다. 고마워요 :) –

+0

그들이 말하는 문서에서 : "예를 들어, err.object [err.start : err.end]는 코덱이 실패한 잘못된 입력을 제공합니다." 이것은 무엇입니까? err.object [err.start : err.end]는 실제로 의미합니까? e.start.와 동일하지 않으며 닫히지도 않습니다. –

+1

@ 쿠퍼 : 잘 잡으세요! 내 대답을 편집해야합니다. 실제로, 그것은 가깝습니다. 그것은 [slice]입니다 (https://docs.python.org/3/reference/expressions.html#slicings). 'err.start'와'err.end' 위치 사이에서 모든 문자를 가져 오는 것을 의미합니다. 여기에는'err.start'가 포함되지만'err.end'는 포함되지 않습니다. 대부분의 경우, 끝은 시작 후 단 한 문자이므로 내 솔루션이 작동합니다. 그러나''err.end''가 둘 이상인 경우가 있다고 생각합니다. – zondo

0
그냥 오류를 무시하고 나머지를 디코딩 할 경우

, 당신은 할 수 있습니다 :

data = data.decode("utf-8", errors='ignore') 
+0

고마워. –

관련 문제