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

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입니다.



답변

파이썬은 바이트 배열 ( 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. 이런 식으로 디코딩 시도가 발생하지 않습니다.


답변

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

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

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


답변

이와 비슷한 문제가 있었지만 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 형식으로 반환합니다. 거기에서 그것은 라인에 의해 해독되고 분리 될 것이다.


답변

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


답변

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

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

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


답변

만 사용

base64.b64decode(a) 

대신에

base64.b64decode(a).decode('utf-8')


답변

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