kesalahan UnicodeDecodeError: 'utf-8' codec tidak dapat mendekode byte 0xff di posisi 0: byte start tidak valid

163

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

Terjadi kesalahan saat mengompilasi "process.py" di situs di atas.

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

Traceback (panggilan terakhir terakhir):

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

Apa penyebab kesalahannya? Versi Python adalah 3.5.2.

pai
sumber

Jawaban:

195

Python mencoba untuk mengkonversi byte-array ( bytesyang diasumsikan sebagai utf-8-encoded string) menjadi string unicode ( str). Proses ini tentu saja merupakan decoding sesuai dengan aturan utf-8. Ketika mencoba ini, ia menemukan urutan byte yang tidak diperbolehkan dalam string utf-8-encoded (yaitu 0xff ini pada posisi 0).

Karena Anda tidak memberikan kode apa pun yang dapat kami lihat, kami hanya dapat menebak sisanya.

Dari jejak stack kita dapat mengasumsikan bahwa tindakan pemicu adalah pembacaan dari file ( contents = open(path).read()). Saya mengusulkan untuk mengode ulang ini dengan cara seperti ini:

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

Bahwa bdalam specifier mode di open()menyatakan bahwa file akan diperlakukan sebagai biner, sehingga contentsakan tetap a bytes. Tidak ada upaya decoding yang akan terjadi dengan cara ini.

Alfe
sumber
Saya mendapatkan kesalahan "ValueError: mode string harus dimulai dengan salah satu dari 'r', 'w', 'a' atau 'U', bukan 'br'"
Unnikrishnan
3
@Unnikrishnan Ok, lalu gunakan rb(saya pikir urutan itu tidak penting, tetapi tampaknya, setidaknya di beberapa sistem / versi). Saya mengubah jawaban saya sesuai.
Alfe
57
byte 0xff in position 0bisa juga berarti file tersebut dikodekan dalam UTF-16, maka Anda dapat melakukannya with open(path, encoding='utf-16') as f:sebagai gantinya
Nikolai R Kristiansen
Bagaimana jika sebenarnya tidak ada 0xffkarakter di posisi 0? Dan itu UTF-8dikodekan.
Iulian Onofrei
'\xFF'Karakter murni akan dikodekan dalam UTF-8 sebagai '\xC3\xBF'. UTF-8 mengkodekan semua karakter dengan satu set MSB menggunakan dua karakter. (Lihat output printf "\xff" | iconv -f latin1 -t utf-8 | xxddalam sebuah shell.) Sebuah kata demi kata '\xFF'di awal string yang dikodekan UTF-8 adalah kesalahan pengkodean (bisa disebut kesalahan sintaksis dalam hal UTF-8).
Alfe
83

Gunakan solusi ini akan menghapus (mengabaikan) karakter dan mengembalikan string tanpa mereka. Gunakan ini hanya jika kebutuhan Anda adalah menelanjangi mereka untuk tidak mengubahnya.

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

Menggunakan errors='ignore' Anda hanya akan kehilangan beberapa karakter. tetapi jika Anda tidak peduli tentang mereka karena mereka tampaknya karakter tambahan yang berasal dari pemformatan dan pemrograman yang buruk dari klien yang terhubung ke server soket saya. Maka itu solusi langsung yang mudah. referensi

Nitish Kumar Pal
sumber
6
Bekerja untuk decode () juga: contents = contents.decode('utf-8', 'ignore')Sumber: docs.python.org/3/howto/unicode.html#the-string-type
naaman
2
Harus menjadi jawaban terbaik
Statham
solusi terbaik dalam kasus penggunaan saya :)
maestromusica
Ketika Anda mengatakan "kehilangan beberapa karakter", apakah maksud Anda file dengan kesalahan tidak akan dibaca? atau tidak semua konten file itu akan dibaca?
msoutopico
@ msoutopico Karena mengabaikan kesalahan, maka beberapa penyandian tidak akan dibaca yang menyebabkan masalah. Tetapi belum pernah menemukan konten apa pun yang telah dilewati saat membaca. Jadi pada dasarnya masalah ecoding diabaikan.
Nitish Kumar Pal
23

Punya masalah yang mirip dengan ini, Berakhir menggunakan UTF-16 untuk memecahkan kode. kode saya di bawah.

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

ini akan mengambil konten file sebagai impor, tetapi akan mengembalikan kode dalam format UTF. dari sana akan diterjemahkan dan dipisahkan oleh garis.

tattmoney76
sumber
10
Dalam Python 3 Anda dapat menyederhanakan ini dengan menggunakan param enkodewith open(path, encoding='utf-16') as f
Nikolai R Kristiansen
@NikolaiRKristiansen Saya mencoba menggunakan metode Anda, tetapi mendapat kesalahan sebagai TypeError: an integer is required (got type str). Mengapa? Kedua file tersebut adalah biner dan dibaca sebagai rb.
Bogota
1
@Logo Param encodinghanya masuk akal saat membaca teks. Jatuhkan 'b' dari argumen mode dan coba lagi. Baca lebih lanjut di dokumen: docs.python.org/3/library/functions.html#open
Nikolai R Kristiansen
19

Gunakan format pengodean ISO-8859-1 untuk menyelesaikan masalah.

Ramineni Ravi Teja
sumber
1
Akhirnya mendarat di ini setelah mencoba 10+ penyandian lainnya!
Rexcirus
15

Saya telah menemukan utas ini ketika mengalami kesalahan yang sama, setelah melakukan beberapa penelitian saya dapat mengonfirmasi, ini adalah kesalahan yang terjadi ketika Anda mencoba mendekode file UTF-16 dengan UTF-8.

Dengan UTF-16 karakter pertama (2 byte dalam UTF-16) adalah Byte Order Mark (BOM) , yang digunakan sebagai petunjuk decoding dan tidak muncul sebagai karakter dalam string yang diterjemahkan. Ini berarti byte pertama adalah FE atau FF dan byte kedua, yang lain.

Sangat diedit setelah saya menemukan jawaban yang sebenarnya

Peter Ogden
sumber
Ini mengakhiri 2 jam sakit kepala! Membuka file dengan open ('nama file', 'r') sebagai f: dan kemudian mencetak isinya menunjukkan UTF-8, yang salah.
nulldroid
4

gunakan saja

base64.b64decode(a) 

dari pada

base64.b64decode(a).decode('utf-8')
Pradeep Karunathilaka
sumber
2
ini bekerja tetapi hanya untuk memahami dapatkah Anda menjelaskan mengapa tolong :)
Ido Bleicher
3

Jika Anda menggunakan mac periksa apakah Anda memiliki file tersembunyi, .DS_Store. Setelah menghapus file, program saya berfungsi.

Juan Navarrete
sumber
1

Periksa jalur file yang akan dibaca. Kode saya terus memberi saya kesalahan sampai saya mengubah nama jalur untuk menyajikan direktori yang berfungsi. Kesalahannya adalah:

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

jika Anda menerima data dari port serial, pastikan Anda menggunakan baudrate kanan (dan konfigurasi lainnya): decoding using ( utf-8 ) tetapi konfigurasi yang salah akan menghasilkan kesalahan yang sama

UnicodeDecodeError: codec 'utf-8' tidak dapat mendekode byte 0xff di posisi 0: byte start tidak valid

untuk memeriksa konfigurasi port serial Anda pada penggunaan linux: stty -F /dev/ttyUSBX -a

Saif Faidi
sumber
1

Ini berarti bahwa seseorang memilih penyandian yang salah untuk membaca file.

Di Mac, gunakan file -I file.txtuntuk menemukan penyandian yang benar. Di Linux, gunakan file -i file.txt.

Minh Triet
sumber
0

Saya memiliki masalah yang sama ketika memproses file yang dihasilkan dari Linux. Ternyata itu terkait dengan file yang berisi tanda tanya ..

Wim Folkerts
sumber
-1

Saya punya masalah serupa.

Dipecahkan dengan:

import io

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

Namun, saya punya masalah lain. Beberapa file html (dalam kasus saya) tidak utf-8, jadi saya menerima kesalahan serupa. Ketika saya mengecualikan file html itu, semuanya bekerja dengan lancar.

Jadi, kecuali dari memperbaiki kode, periksa juga file yang Anda baca, mungkin memang ada ketidakcocokan di sana.

Kostas Tsiligkiris
sumber
-5

Jika memungkinkan, buka file dalam editor teks dan cobalah untuk mengubah encoding ke UTF-8. Kalau tidak, lakukan pemrograman pada tingkat OS.

Manoj Joshi
sumber
-5

Saya punya masalah serupa. Saya mencoba menjalankan contoh di tensorflow / models / objective_detection dan bertemu pesan yang sama. Cobalah untuk mengubah Python3 ke Python2

pengguna8665083
sumber