lỗi UnicodeDecodeError: 'utf-8' codec không thể giải mã byte 0xff ở vị trí 0: byte bắt đầu không hợp lệ


162

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

Đã xảy ra lỗi khi biên dịch "process.py" trên trang web trên.

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

TracBack (cuộc gọi gần đây nhất vừa qua):

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

Nguyên nhân của lỗi là gì? Phiên bản của Python là 3.5.2.

Câu trả lời:


194

Python cố gắng chuyển đổi một mảng byte (a bytes mà nó giả sử là một chuỗi được mã hóa utf-8) thành một chuỗi unicode ( str). Quá trình này tất nhiên là giải mã theo quy tắc utf-8. Khi thử điều này, nó gặp một chuỗi byte không được phép trong các chuỗi được mã hóa utf-8 (cụ thể là 0xff này ở vị trí 0).

Vì bạn không cung cấp bất kỳ mã nào chúng tôi có thể xem, chúng tôi chỉ có thể đoán phần còn lại.

Từ dấu vết ngăn xếp, chúng ta có thể giả sử rằng hành động kích hoạt là việc đọc từ một tệp ( contents = open(path).read()). Tôi đề nghị mã hóa lại điều này theo cách như sau:

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

Trong btrình xác định chế độ ở open()trạng thái tệp sẽ được coi là nhị phân, do đó contentssẽ vẫn là a bytes. Không có nỗ lực giải mã sẽ xảy ra theo cách này.


Tôi đang gặp lỗi "ValueError: chuỗi chế độ phải bắt đầu bằng một trong các 'r', 'w', 'a' hoặc 'U', không phải 'br'"
Unnikrishnan

3
@Unnikrishnan Ok, sau đó sử dụng rb(Tôi nghĩ rằng thứ tự không quan trọng, nhưng dường như, ít nhất là trong một số hệ thống / phiên bản). Tôi đã thay đổi câu trả lời của tôi cho phù hợp.
Alfe

57
byte 0xff in position 0cũng có thể có nghĩa là tệp được mã hóa theo UTF-16, sau đó bạn có thể làm with open(path, encoding='utf-16') as f:thay thế
Nikolai R Kristiansen

Điều gì nếu thực sự không có 0xffnhân vật ở vị trí 0? Và nó được UTF-8mã hóa.
Iulian Onofrei

Một '\xFF'ký tự thuần túy sẽ được mã hóa theo UTF-8 dưới dạng '\xC3\xBF'. UTF-8 mã hóa tất cả các ký tự với một MSB được đặt bằng hai ký tự. (Xem đầu ra của printf "\xff" | iconv -f latin1 -t utf-8 | xxdshell.) Một nguyên văn '\xFF'ở đầu chuỗi mã hóa UTF-8 là một lỗi mã hóa (có thể được gọi là lỗi cú pháp theo thuật ngữ UTF-8).
Alfe

83

Sử dụng giải pháp này, nó sẽ loại bỏ (bỏ qua) các ký tự và trả về chuỗi mà không có chúng. Chỉ sử dụng điều này nếu nhu cầu của bạn là tước chúng chứ không chuyển đổi chúng.

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

Sử dụng errors='ignore' Bạn sẽ chỉ mất một số ký tự. nhưng nếu bạn không quan tâm đến chúng vì chúng dường như là các ký tự phụ có nguồn gốc từ định dạng và lập trình xấu của các máy khách kết nối với máy chủ ổ cắm của tôi. Sau đó, nó là một giải pháp trực tiếp dễ dàng. tài liệu tham khảo


6
Cũng hoạt động cho giải mã (): contents = contents.decode('utf-8', 'ignore')Nguồn: docs.python.org/3/howto/unicode.html#the-opes-type
naaman

2
Nên là câu trả lời hay nhất
Statham

giải pháp tốt nhất trong trường hợp sử dụng của tôi :)
maestromusica

Khi bạn nói "mất một số ký tự", bạn có nghĩa là tệp bị lỗi sẽ không được đọc? hoặc không phải tất cả nội dung của tập tin đó sẽ được đọc?
msoutopico

@msoutopico Vì nó đang bỏ qua các lỗi, vì vậy một số mã hóa sẽ không được đọc gây ra sự cố. Nhưng chưa bao giờ bắt gặp bất kỳ nội dung nào đã bị bỏ qua trong khi đọc. Vì vậy, về cơ bản các vấn đề ecoding được bỏ qua.
Nitish Kumar Pal

23

Có một vấn đề tương tự như vậy, Đã kết thúc bằng UTF-16 để giải mã. mã của tôi ở dưới

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

điều này sẽ lấy nội dung tệp dưới dạng nhập, nhưng nó sẽ trả về mã ở định dạng UTF. từ đó nó sẽ được giải mã và phân tách bằng các dòng.


10
Trong Python 3, bạn có thể đơn giản hóa việc này bằng cách sử dụng tham số mã hóawith open(path, encoding='utf-16') as f
Nikolai R Kristiansen

@NikolaiRKristiansen Tôi đã thử sử dụng phương pháp của bạn, nhưng gặp lỗi như TypeError: an integer is required (got type str). Tại sao? Cả hai tập tin là nhị phân và đọc là rb.
Bogota

1
@Bogota Các encodingparam chỉ có ý nghĩa khi đọc văn bản. Thả 'b' từ đối số chế độ và thử lại. Đọc thêm trong các tài liệu: docs.python.org/3/l Library / fiances.html
Nikolai R Kristiansen

19

Sử dụng định dạng mã hóa ISO-8859-1 để giải quyết vấn đề.


1
Cuối cùng đã hạ cánh trên này sau khi thử hơn 10 bảng mã khác!
Rexcirus

15

Tôi đã gặp chủ đề này khi gặp lỗi tương tự, sau khi thực hiện một số nghiên cứu tôi có thể xác nhận, đây là lỗi xảy ra khi bạn cố gắng giải mã tệp UTF-16 bằng UTF-8.

Với UTF-16, characther đầu tiên (2 byte trong UTF-16) là Dấu thứ tự byte (BOM) , được sử dụng làm gợi ý giải mã và không xuất hiện dưới dạng ký tự trong chuỗi được giải mã. Điều này có nghĩa là byte đầu tiên sẽ là FE hoặc FF và byte thứ hai.

Chỉnh sửa nặng nề sau khi tôi tìm ra câu trả lời thực sự


Điều này đã kết thúc 2 giờ đau đầu! Mở tệp bằng open ('tên tệp', 'r') là f: và sau đó in nội dung của nó cho thấy UTF-8, sai.
nulldroid

4

chỉ sử dụng

base64.b64decode(a) 

thay vì

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

2
Nó hoạt động nhưng chỉ để hiểu bạn có thể khám phá tại sao xin vui lòng? :)
Ido Ble Rich

3

Nếu bạn đang ở trên máy Mac, hãy kiểm tra xem bạn có cho một tệp bị ẩn không, .DS_Store. Sau khi loại bỏ các tập tin chương trình của tôi làm việc.


1

Kiểm tra đường dẫn của tệp sẽ được đọc. Mã của tôi tiếp tục cho tôi lỗi cho đến khi tôi thay đổi tên đường dẫn thành thư mục làm việc. Lỗi là:

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

1

nếu bạn đang nhận dữ liệu từ một cổng nối tiếp, hãy đảm bảo rằng bạn đang sử dụng đúng baudrate (và các cấu hình khác): giải mã bằng cách sử dụng ( utf-8 ) nhưng cấu hình sai sẽ tạo ra lỗi tương tự

UnicodeDecodeError: 'utf-8' codec không thể giải mã byte 0xff ở vị trí 0: byte bắt đầu không hợp lệ

để kiểm tra cấu hình cổng nối tiếp của bạn trên linux, hãy sử dụng: stty -F /dev/ttyUSBX -a


1

Nó đơn giản có nghĩa là người ta đã chọn mã hóa sai để đọc tệp.

Trên Mac, sử dụng file -I file.txtđể tìm mã hóa chính xác. Trên Linux, sử dụng file -i file.txt.


0

Tôi gặp vấn đề tương tự khi xử lý một tệp được tạo từ Linux. Hóa ra nó có liên quan đến các tập tin chứa dấu hỏi ..


-1

Tôi đã có một vấn đề tương tự.

Giải quyết nó bằng cách:

import io

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

Tuy nhiên, tôi đã có một vấn đề khác. Một số tệp html (trong trường hợp của tôi) không phải là utf-8, vì vậy tôi đã nhận được một lỗi tương tự. Khi tôi loại trừ các tệp html đó, mọi thứ đều hoạt động trơn tru.

Vì vậy, ngoại trừ việc sửa mã, hãy kiểm tra các tệp bạn đang đọc, có thể có sự không tương thích ở đó.


-4

Nếu có thể, hãy mở tệp trong trình soạn thảo văn bản và thử thay đổi mã hóa thành UTF-8. Nếu không thì làm điều đó theo chương trình ở cấp độ HĐH.


-4

Tôi có một vấn đề tương tự. Tôi cố gắng chạy một ví dụ trong tenorflow / model / object_detection và gặp cùng một thông báo. Cố gắng thay đổi Python3 thành Python2

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.