"for line in…"은 UnicodeDecodeError를 발생시킵니다 : 'utf-8'코덱이 바이트를 디코딩 할 수 없습니다


215

여기 내 코드가 있습니다.

for line in open('u.item'):
#read each line

이 코드를 실행할 때마다 다음 오류가 발생합니다.

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2892: invalid continuation byte

이 문제를 해결하고 open ()에 추가 매개 변수를 추가하려고했습니다. 코드는 다음과 같습니다.

for line in open('u.item', encoding='utf-8'):
#read each line

그러나 다시 같은 오류가 발생합니다. 그럼 어떻게해야합니까! 도와주세요.


3
내가 잘못 가정 한 데이터.
Andreas Jung

9
또는 UTF-8 데이터가 아닙니다.
Mark Tolonen


파이썬 2.7 대신 파이썬 3을 사용할 때 msgpack 에서이 오류가 발생했습니다. 우리에게는 행동 과정이 파이썬 2.7과 함께 작동하는 것이 었습니다.
제시 W. 콜린스

답변:


404

Mark Ransom이 제안한 것처럼 해당 문제에 적합한 인코딩을 찾았습니다. 인코딩 정도로 교체 "ISO-8859"을 open("u.item", encoding="utf-8")가진 open('u.item', encoding = "ISO-8859-1")문제점을 해결하는 것이다.


8
명시 적이 암시 적보다 낫습니다 (PEP 20).
Ioannis Filippidis 5

6
비결은 ISO-8859-1 또는 Latin_1이 8 비트 문자 세트이므로 모든 가비지에는 유효한 값이 있습니다. 아마도 사용할 수는 없지만 무시하고 싶다면!
Kjeld Flarup

1
동일한 문제가 UnicodeDecodeError : 'utf-8'코덱이 32 위치의 바이트 0xd0을 디코딩 할 수 없습니다 : 잘못된 연속 바이트입니다. 파이썬 3.6.5를 사용하여 AWS CLI를 설치했습니다. 그리고 aws --version을 시도했을 때이 오류로 실패했습니다. 그래서 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py를 편집하고 코드를 다음 def read (self, filenames, encoding = "ISO-8859-1"로 변경했습니다. ) :
Евгений Коптюбенко

3
인코딩을 자동으로 감지하는 방법이 있습니까?
OrangeSherbet

5
@OrangeSherbet 나는을 사용하여 감지를 구현했습니다 chardet. 다음은 one-liner입니다 ( import chardet) chardet.detect(open(in_file, 'rb').read())['encoding']. 자세한 내용은이 답변을 확인하십시오. stackoverflow.com/a/3323810/615422
VertigoRay

51

ISO 8859-1은 주로 Speech Recognition API를 사용하는 경우 많은 것을 절약 할 것입니다.

예:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1");

4
오류 메시지의 0xe9 (é)에서 추론 할 수있는 것처럼 OP가 ISO 8859-1을 읽고 있음이 정확할 수 있지만 솔루션이 작동하는 이유를 설명해야합니다. 음성 인식 API에 대한 참조는 도움이되지 않습니다.
RolfBly

5
세미콜론은 무엇입니까?
오른쪽 다리

29

파일에 실제로 utf-8로 인코딩 된 데이터가없고 다른 인코딩이 포함되어 있습니다. 해당 인코딩이 무엇인지 파악하고 open통화에 사용하십시오 .

예를 들어 Windows-1252 인코딩 0xe9에서는 문자가 é됩니다.


4
그렇다면 어떤 인코딩인지 어떻게 알 수 있습니까? 저는 리눅스를 사용하고 있습니다
SujitS

4
항상 작동하는 방법은 없지만이 질문에 대한 답변을 참조하십시오 : stackoverflow.com/questions/436220/…
RemcoGerlich

20

팬더를 사용하여 읽으십시오.

pd.read_csv('u.item', sep='|', names=m_cols , encoding='latin-1')

왜 팬더를 추천하는지 모르겠습니다. 해결책은 올바른 인코딩을 설정하는 것입니다.
Alastair McCormack

12

Python 2다음을 사용 하는 경우 해결책이 있습니다.

import io
for line in io.open("u.item", encoding="ISO-8859-1"):
    # do something

encoding매개 변수가 작동하지 않기 때문에open() 다음 오류가 발생합니다.

TypeError : 'encoding'은이 함수에 유효하지 않은 키워드 인수입니다.

1
그러나 이것은 버전 3입니다
SujitS

1
그래 알아 나는 그것이 다음을 사용하는 사람들에게 도움이 될 것이라고 생각했습니다.Python 2
Jeril

Python3에서도 저를 위해 일했습니다
fenkerbb

2
기억하기 쉬운 것을 원한다면 or 'ISO-8859-1'라고도합니다 . 'latin-1''latin1'
Max Candocia

9

다음과 같은 문제를 해결할 수 있습니다.

for line in open(your_file_path, 'rb'):

'rb'는 이진 모드에서 파일을 읽고 있습니다. 자세한 내용은 여기를 참조 하십시오 . 이것이 도움이되기를 바랍니다!



2

누군가 이것을 찾고 있다면, 이것은 Python 3에서 CSV 파일을 변환하는 예제입니다.

try:
    inputReader = csv.reader(open(argv[1], encoding='ISO-8859-1'), delimiter=',',quotechar='"')
except IOError:
    pass

2

때때로open(filepath)하는 filepath사실이 아닌 파일은 존재 열려고하고 있는지 파일을 그래서 첫째로, 같은 오류를 얻을 것이다 :

import os
assert os.path.isfile(filepath)

이것이 도움이되기를 바랍니다.


1

이 방법으로 시도 할 수 있습니다 :

open('u.item', encoding='utf8', errors='ignore')

이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 의견을 남겨주십시오. - 검토에서
MartenCatcher
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.