2013-08-23 5 views
5

내가이있다 "0xc3"바이트를 디코딩 할 수있는 'UTF8'코덱UnicodeDecodeError : 파이썬 2.7에서

with open("abc.txt", 'r', encoding='utf-8') as f: 
    f.read() 

다음 항목 만 가져 오기 :

File "C:\Python32\lib\codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 633096: invalid continuation byte 

내가 잘못 했습니까? 메모장 ++는 문서가 유니 코드 utf-8임을 나타냅니다. 메모장 + +에서이 형식으로 문서를 변환하려고해도 Python 3에서이 오류가 발생합니다. 이는 문제없이 다른 많은 utf-8로 인코딩 된 문서를 읽은 이후 이상합니다.

+0

'od'는 그 위치 주변의 문자에 대해 무엇을 말합니까? –

답변

3

내 생각에 입력 내용은 Ă0xC3 인 ISO-8859-2로 인코딩되어 있습니다. 입력 파일의 인코딩을 확인하십시오.

+0

메모장 ++에서는 문서가 BOM없이 UTF8로 인코딩되었음을 나타냅니다. – Baz

+8

@Baz 메모장 ++는 잘못 생각할 수 있습니다. 인코딩을 추측 할 수있는 확실한 방법은 없습니다. 모든 프로그램은 때로는 잘못된 인코딩을 추측 할 것입니다. 그래서 항상 파일의 인코딩을 알아야합니다. 인코딩을 utf-8로 명시 적으로 만드는 파일을 다시 작성해보십시오 (예 :'open' 대신'codecs.open '사용). – Bakuriu

2

Python 2.7에서 예외가 발생하지 않는다는 사실에 근거하여 i.words()이 바이트 테스트 시퀀스를 반환한다고 추측합니다. 이러한 것들은 UTF8로 인코딩 될 것 같지 않습니다. 아마도 Latin-1이나 그와 비슷한 것을 추측 할 수 있습니다. 그런 다음 파일에 기록합니다. 이 시점에서 인코딩이 수행되지 않습니다.

기존 인코딩을 알아야 할 유니 코드 문자열로 변환해야 할 수도 있습니다. 그런 다음 파일을 작성할 때 UTF-8로 인코딩해야합니다. 예를 들어

:

  • -*- coding: utf-8 -*- 라인은 파이썬 스크립트 자체를 작성하는 데 사용 인코딩을 의미한다 :

    # -*- coding: utf-8 -*- 
    from nltk.corpus import abc 
    import codecs 
    with codecs.open("abc.txt","w","utf-8") as f: 
        f.write(u" ".join(codecs.decode(word,"latin-1") for word in i.words())) 
    

    일부 더 노트, 경우에 혼란이있다. 스크립트의 입력 또는 출력에는 영향을주지 않습니다.

  • Python 2.7에는 두 가지 종류의 문자열이 있습니다. 즉, 지정되지 않은 인코딩을 사용하는 바이트 시퀀스 인 바이트 문자열과 유니 코드 코드 포인트의 시퀀스 인 유니 코드 문자열이 있습니다. 바이트 스트링이 가장 많이 사용되며 일반 "abc" 문자열 리터럴 구문을 사용하면 얻을 수 있습니다. 유니 코드 문자열은 u"abc" 구문을 사용할 때 얻을 수있는 문자열입니다.
  • Python 2.7에서 open 함수를 사용하여 파일을 열고 bytestrings을 쓰면 인코딩이 수행되지 않습니다. 바이트 스트림의 바이트는 파일에 직접 기록됩니다. 유니 코드 문자열을 쓰려고하면 기본 (ASCII) 코덱으로 인코딩 할 수없는 문자가 포함 된 경우 예외가 발생합니다.
관련 문제