Hasil “untuk baris masuk…” di UnicodeDecodeError: codec 'utf-8' tidak dapat mendekode byte

241

Ini kode saya,

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

setiap kali saya menjalankan kode ini, ia memberikan kesalahan berikut:

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

Saya mencoba menyelesaikan ini dan menambahkan parameter tambahan di open (), kodenya terlihat seperti;

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

Tapi sekali lagi ini memberikan kesalahan yang sama. apa yang harus saya lakukan! Tolong bantu.

SujitS
sumber
3
Data yang dikodekan dengan buruk menurut saya.
Andreas Jung
9
Atau tidak hanya data UTF-8.
Mark Tolonen
Kami mengalami kesalahan ini dengan msgpack saat menggunakan python 3, bukan python 2.7. Bagi kami, tindakannya adalah bekerja dengan python 2.7.
Jesse W. Collins

Jawaban:

443

Seperti yang disarankan oleh Mark Ransom , saya menemukan pengkodean yang tepat untuk masalah itu. Enkode dulu "ISO-8859-1", jadi mengganti open("u.item", encoding="utf-8")dengan open('u.item', encoding = "ISO-8859-1")akan menyelesaikan masalah.

SujitS
sumber
8
Eksplisit lebih baik daripada implisit (PEP 20).
Ioannis Filippidis
6
Triknya adalah ISO-8859-1 atau Latin_1 adalah kumpulan karakter 8 bit, sehingga semua sampah memiliki nilai yang valid. Mungkin tidak bisa digunakan, tetapi jika Anda ingin mengabaikannya!
Kjeld Flarup
1
Saya memiliki masalah yang sama UnicodeDecodeError: 'utf-8' codec tidak dapat memecahkan kode byte 0xd0 di posisi 32: byte kelanjutan tidak valid. Saya menggunakan python 3.6.5 untuk menginstal aws cli. Dan ketika saya mencoba aws --version gagal dengan kesalahan ini. Jadi saya harus mengedit /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/configparser.py dan mengubah kode menjadi def read (self, filenames, encoding = "ISO-8859-1" ):
Евгений Коптюбенко
4
Apakah ada cara otomatis untuk mendeteksi encoding?
OrangeSherbet
8
@OrangeSherbet Saya menerapkan deteksi menggunakan chardet. Inilah satu-kapal (setelah import chardet): chardet.detect(open(in_file, 'rb').read())['encoding']. Lihat jawaban ini untuk detailnya: stackoverflow.com/a/3323810/615422
VertigoRay
55

Juga berhasil untuk saya, ISO 8859-1 akan banyak menghemat, hahaha, terutama jika menggunakan Speech Recognition API

Contoh:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1");
Ryoji Kuwae Neto
sumber
4
Anda mungkin benar bahwa OP membaca ISO 8859-1, seperti yang dapat disimpulkan dari 0xe9 (é) di pesan kesalahan, tetapi Anda harus menjelaskan mengapa solusi Anda berfungsi. Referensi ke API pengenalan ucapan tidak membantu.
RolfBly
7
Ada apa dengan titik koma?
Kaki kanan
30

File Anda sebenarnya tidak berisi data yang dikodekan utf-8, itu berisi beberapa pengkodean lainnya. Cari tahu apa itu encoding dan gunakan dalam openpanggilan.

Dalam pengkodean Windows-1252 misalnya, 0xe9akan menjadi karakter é.

Mark Ransom
sumber
4
Jadi, Bagaimana saya bisa mengetahui apa itu encoding! Saya menggunakan linux
SujitS
4
Tidak ada cara untuk melakukan itu yang selalu berhasil, tetapi lihat jawaban untuk pertanyaan ini: stackoverflow.com/questions/436220/…
RemcoGerlich
21

Coba ini untuk membaca menggunakan panda

pd.read_csv('u.item', sep='|', names=m_cols , encoding='latin-1')
Shashank
sumber
Tidak yakin mengapa Anda menyarankan Pandas. Solusinya adalah menyetel pengkodean yang benar, yang kebetulan Anda temukan di sini.
Alastair McCormack
13

Jika Anda menggunakan Python 2solusi berikut ini:

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

Karena encodingparameter tidak berfungsi open(), Anda akan mendapatkan kesalahan berikut:

TypeError: 'encoding' adalah argumen kata kunci yang tidak valid untuk fungsi ini
Jeril
sumber
1
Tapi ini versi 3
SujitS
1
Ya aku tahu. Saya pikir ini mungkin berguna bagi orang-orang yang menggunakanPython 2
Jeril
Bekerja untuk saya dengan Python3 juga
fenkerbb
2
Jika Anda menginginkan sesuatu yang lebih mudah diingat, 'ISO-8859-1'juga dikenal sebagai 'latin-1'atau 'latin1'.
Max Candocia
11

Anda dapat menyelesaikan masalah dengan:

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

'rb' sedang membaca file dalam mode biner. Baca lebih lanjut di sini . Semoga ini bisa membantu!

Ozcar Nguyen
sumber
9

Ini bekerja:

open('filename', encoding='latin-1')

atau:

open('filename',encoding="ISO-8859-1")
Ayesha Siddiqa
sumber
3

Anda bisa mencoba cara ini:

open('u.item', encoding='utf8', errors='ignore')
FaridLU
sumber
Ini tidak memberikan jawaban atas pertanyaan tersebut. Untuk mengkritik atau meminta klarifikasi dari seorang penulis, tinggalkan komentar di bawah postingannya. - Dari Ulasan
MartenCatcher
2

Jika seseorang mencari ini, ini adalah contoh untuk mengonversi file CSV dengan Python 3:

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

Terkadang ketika open(filepath)yang filepathsebenarnya bukan file akan mendapatkan kesalahan yang sama, jadi pertama-tama pastikan file yang Anda coba buka ada:

import os
assert os.path.isfile(filepath)

semoga ini bisa membantu.

xtluo.dll
sumber