error UnicodeDecodeError : 'utf-8'코덱이 위치 0에서 바이트 0xff를 디코딩 할 수 없습니다 : 유효하지 않은 시작 바이트


163

https://github.com/affinelayer/pix2pix-tensorflow/tree/master/tools

위 사이트에서 "process.py"를 컴파일 할 때 오류가 발생했습니다.

 python tools/process.py --input_dir data --            operation resize --outp
ut_dir data2/resize
data/0.jpg -> data2/resize/0.png

역 추적 (가장 최근 통화) :

File "tools/process.py", line 235, in <module>
  main()
File "tools/process.py", line 167, in main
  src = load(src_path)
File "tools/process.py", line 113, in load
  contents = open(path).read()
      File"/home/user/anaconda3/envs/tensorflow_2/lib/python3.5/codecs.py", line 321, in decode
  (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode     byte 0xff in position 0: invalid start byte

오류의 원인은 무엇입니까? 파이썬 버전은 3.5.2입니다.

답변:


194

파이썬은 바이트 배열 ( bytesutf-8로 인코딩 된 문자열이라고 가정)을 유니 코드 문자열 ( str) 로 변환하려고합니다 . 이 과정은 물론 utf-8 규칙에 따른 디코딩입니다. 이 작업을 시도하면 UTF-8 인코딩 문자열 (즉, 위치 0의 0xff)에서 허용되지 않는 바이트 시퀀스가 ​​발생합니다.

우리가 볼 수있는 코드를 제공하지 않았으므로 나머지 부분 만 추측 할 수 있습니다.

스택 추적에서 트리거링 조치가 파일에서 읽은 것으로 가정 할 수 있습니다 ( contents = open(path).read()). 나는 이것을 다음과 같은 방식으로 코딩 할 것을 제안합니다.

with open(path, 'rb') as f:
  contents = f.read()

그건 b의 모드 지정에 open()파일을 바이너리로 취급되어야한다고, 그래서 contents유지됩니다 bytes. 이런 식으로 디코딩 시도가 발생하지 않습니다.


"ValueError : 모드 문자열은 'br'이 아닌 'r', 'w', 'a'또는 'U'중 하나로 시작해야합니다."라는 오류가 표시됩니다.
Unnikrishnan

3
@ Unnikrishnan Ok, 그런 다음 사용하십시오 rb(순서는 중요하지 않다고 생각했지만 적어도 일부 시스템 / 버전에서는 것 같습니다). 나는 그에 따라 대답을 바꿨다.
Alfe

57
byte 0xff in position 0또한 UTF-16으로 인코딩 된 파일을 의미 할 수있다, 당신은 할 수있는 with open(path, encoding='utf-16') as f:대신에
니콜라이 R Kristiansen이

실제로 0xff위치에 캐릭터 가 없으면 0어떻게됩니까? 그리고 그것은 UTF-8인코딩됩니다.
Iulian Onofrei

순수 '\xFF'문자는 UTF-8로로 인코딩됩니다 '\xC3\xBF'. UTF-8은 두 문자를 사용하여 설정된 MSB로 모든 문자를 인코딩합니다. printf "\xff" | iconv -f latin1 -t utf-8 | xxd셸에서 출력을 참조하십시오 . '\xFF'UTF-8로 인코딩 된 문자열의 시작 부분에있는 약어 는 인코딩 오류입니다 (UTF-8의 관점에서 구문 오류라고 함).
Alfe

83

이 솔루션을 사용하면 문자를 제거하고 무시하고 문자열을 반환합니다. 변환하지 않고 제거해야 할 경우에만 사용하십시오.

with open(path, encoding="utf8", errors='ignore') as f:

사용하면 errors='ignore' 일부 캐릭터 만 잃게됩니다. 그러나 소켓 서버에 연결하는 클라이언트의 잘못된 형식 지정 및 프로그래밍으로 인해 추가 문자 인 것처럼 보이므로 걱정하지 않는다면. 그런 다음 쉬운 직접 솔루션입니다. 참고


6
디코딩을위한 작품 ()뿐만 아니라 : contents = contents.decode('utf-8', 'ignore')출처 : docs.python.org/3/howto/unicode.html#the-string-type
나아만

2
가장 좋은 답변이어야 함
Statham

내 사용 사례에서 최고의 솔루션 :)
maestromusica

"일부 문자를 잃어 버렸다"고 말하면 오류가있는 파일을 읽을 수 없다는 의미입니까? 또는 해당 파일의 모든 내용을 읽을 수는 없습니까?
msoutopico

@msoutopico 오류를 무시하고 있으므로 일부 인코딩을 읽을 수 없으므로 문제가 발생합니다. 그러나 읽는 동안 건너 뛴 내용은 본 적이 없습니다. 따라서 기본적으로 인코딩 문제는 무시됩니다.
Nitish Kumar Pal

23

이와 비슷한 문제가 있었지만 UTF-16을 사용하여 디코딩했습니다. 내 코드는 다음과 같습니다.

with open(path_to_file,'rb') as f:
    contents = f.read()
contents = contents.rstrip("\n").decode("utf-16")
contents = contents.split("\r\n")

파일 내용을 가져 오기로 사용하지만 코드를 UTF 형식으로 반환합니다. 거기에서 그것은 라인에 의해 해독되고 분리 될 것이다.


10
Python 3에서는 인코딩 매개 변수를 사용하여이를 단순화 할 수 있습니다.with open(path, encoding='utf-16') as f
Nikolai R Kristiansen

@NikolaiRKristiansen 나는 당신의 방법을 사용하려고 시도했지만 오류가 발생했습니다 TypeError: an integer is required (got type str). 왜? 두 파일 모두 바이너리이며로 읽습니다 rb.
보고타

1
@Bogota이 encoding매개 변수는 텍스트를 읽을 때만 의미가 있습니다. mode 인수에서 'b'를 삭제하고 다시 시도하십시오. 문서에서 더 읽기 : docs.python.org/3/library/functions.html#open
Nikolai R Kristiansen

19

인코딩 형식 ISO-8859-1 을 사용 하여 문제를 해결하십시오.


1
마지막으로 10 개 이상의 다른 인코딩을 시도한 후이 문제에 착수했습니다!
Rexcirus

15

동일한 오류가 발생했을 때이 스레드를 발견했습니다. 확인 할 수있는 몇 가지 연구를 수행 한 후 UTF-8 파일을 UTF-8로 디코딩하려고 할 때 발생하는 오류입니다.

UTF-16을 사용하면 첫 번째 문자 (UTF-16의 2 바이트)는 디코딩 순서 로 사용되며 디코딩 된 문자열에 문자로 표시되지 않는 BOM (Byte Order Mark) 입니다. 이는 첫 번째 바이트는 FE 또는 FF이고 두 번째 바이트는 다른 바이트입니다.

실제 답변을 찾은 후에 크게 편집


이것은 2 시간의 두통을 끝내었다! open ( 'filename', 'r')을 f :로 사용하여 파일을 연 다음 내용을 인쇄하면 UTF-8이 표시됩니다.
nulldroid


3

Mac에있는 경우 숨겨진 파일 (.DS_Store)이 있는지 확인하십시오. 파일을 제거한 후 내 프로그램이 작동했습니다.


1

읽을 파일의 경로를 확인하십시오. 작업 디렉토리를 표시하도록 경로 이름을 변경할 때까지 코드에서 계속 오류가 발생합니다. 오류는 다음과 같습니다

newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

1

직렬 포트에서 데이터를 수신하는 경우 올바른 전송 속도 (및 다른 구성)를 사용하고 있는지 확인하십시오 : ( utf-8 )을 사용하여 디코딩 하지만 잘못된 구성은 동일한 오류를 생성합니다

UnicodeDecodeError : 'utf-8'코덱이 위치 0에서 바이트 0xff를 디코딩 할 수 없습니다 : 유효하지 않은 시작 바이트

Linux에서 직렬 포트 구성을 확인하려면 다음을 사용하십시오. stty -F /dev/ttyUSBX -a


1

단순히 파일을 읽을 때 잘못된 인코딩을 선택했음을 의미합니다.

Mac에서는 file -I file.txt올바른 인코딩을 찾는 데 사용하십시오. Linux에서는을 사용하십시오 file -i file.txt.


0

Linux에서 생성 된 파일을 처리 할 때도 같은 문제가 있습니다. 물음표가 포함 된 파일과 관련이 있습니다.


-1

나는 비슷한 문제가 있었다.

그것을 해결했다 :

import io

with io.open(filename, 'r', encoding='utf-8') as fn:
  lines = fn.readlines()

그러나 나는 또 다른 문제가 있었다. 내 HTML 파일 중 일부는 UTF-8이 아니기 때문에 비슷한 오류가 발생했습니다. 해당 html 파일을 제외하면 모든 것이 원활하게 작동했습니다.

따라서 코드를 수정하는 것 외에는 읽고있는 파일도 확인하십시오. 실제로 호환되지 않을 수 있습니다.


-4

가능하면 텍스트 편집기에서 파일을 열고 인코딩을 UTF-8로 변경하십시오. 그렇지 않으면 OS 수준에서 프로그래밍 방식으로 수행하십시오.


-4

비슷한 문제가 있습니다. tensorflow / models / objective_detection에서 예제를 실행하려고 시도하고 동일한 메시지를 만났습니다. Python3을 Python2로 변경하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.