Kết quả cho dòng trong phiên bản của Leo trong UnicodeDecodeError: codec 'utf-8' không thể giải mã byte


214

Đây là mã của tôi,

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

Bất cứ khi nào tôi chạy mã này, nó sẽ báo lỗi sau:

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

Tôi đã cố gắng giải quyết điều này và thêm một tham số phụ trong open (), mã trông như thế nào;

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

Nhưng một lần nữa, nó cho cùng một lỗi. tôi nên làm cái gì sau đó! Xin vui lòng giúp đỡ.


3
Dữ liệu được mã hóa xấu tôi sẽ giả sử.
Andreas Jung

9
Hoặc không chỉ là dữ liệu UTF-8.
Đánh dấu Tolonen


Chúng tôi đã gặp lỗi này với Spypack khi sử dụng python 3 thay vì python 2.7. Đối với chúng tôi, quá trình hành động là làm việc với python 2.7.
Jesse W. Collins

Câu trả lời:


402

Theo đề xuất của Mark Ransom, tôi đã tìm thấy mã hóa phù hợp cho vấn đề đó. Mã hóa là "ISO-8859-1", vì vậy thay thế open("u.item", encoding="utf-8")bằng open('u.item', encoding = "ISO-8859-1")sẽ giải quyết vấn đề.


8
Rõ ràng là tốt hơn so với ngầm (PEP 20).
Ioannis Filippidis

6
Thủ thuật là ISO-8859-1 hoặc Latin_1 là các bộ ký tự 8 bit, do đó tất cả rác đều có giá trị hợp lệ. Có lẽ không thể sử dụng được, nhưng nếu bạn muốn bỏ qua!
Kjeld Flarup

1
Tôi gặp vấn đề tương tự UnicodeDecodeError: 'utf-8' codec không thể giải mã byte 0xd0 ở vị trí 32: byte tiếp tục không hợp lệ. Tôi đã sử dụng python 3.6.5 để cài đặt aws cli. Và khi tôi thử aws --version nó đã thất bại với lỗi này. Vì vậy, tôi đã phải chỉnh sửa / L Library / Frameworks / Python.framework / Vionsions / .6 / lib / python3.6 / configparser.py và thay đổi mã thành def đọc sau (self, filenames, mã hóa = "ISO-8859-1" ):
ЕЕгггг г г

3
Có một cách tự động phát hiện mã hóa?
OrangeSherbet

5
@OrangeSherbet Tôi đã thực hiện phát hiện bằng cách sử dụng chardet. Đây là một lớp lót (sau import chardet) : chardet.detect(open(in_file, 'rb').read())['encoding']. Kiểm tra câu trả lời này để biết chi tiết: stackoverflow.com/a/3323810/615422
VertigoRay 20/03/19

51

Cũng làm việc với tôi, ISO 8859-1 sẽ tiết kiệm rất nhiều, hahaha, chủ yếu nếu sử dụng API nhận dạng giọng nói

Thí dụ:

file = open('../Resources/' + filename, 'r', encoding="ISO-8859-1");

4
Bạn có thể đúng rằng OP đang đọc ISO 8859-1, như có thể được suy ra từ 0xe9 (é) trong thông báo lỗi, nhưng bạn nên giải thích lý do tại sao giải pháp của bạn hoạt động. Tham chiếu đến API nhận dạng giọng nói không giúp được gì.
RolfBly

5
Những gì với dấu chấm phẩy?
Chân phải

29

Tệp của bạn không thực sự chứa dữ liệu được mã hóa utf-8, nó chứa một số mã hóa khác. Chỉ ra mã hóa đó là gì và sử dụng nó trongopen cuộc gọi.

Ví dụ, trong mã hóa Windows-1252, ký tự 0xe9sẽ là ký tự é.


4
Vì vậy, làm thế nào tôi có thể tìm ra mã hóa là gì! Tôi đang sử dụng linux
SujitS

3
Không có cách nào để làm điều đó luôn hoạt động, nhưng hãy xem câu trả lời cho câu hỏi này: stackoverflow.com/questions/436220/ Hãy
RemcoGerlich

20

Hãy thử điều này để đọc bằng cách sử dụng gấu trúc

pd.read_csv('u.item', sep='|', names=m_cols , encoding='latin-1')

Không chắc chắn tại sao bạn đề xuất gấu trúc. Giải pháp là thiết lập mã hóa chính xác, mà bạn đã tình cờ ở đây.
Alastair McCormack

12

Nếu bạn đang sử dụng Python 2, đây sẽ là giải pháp:

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

Bởi vì encodingtham số không hoạt động vớiopen() , bạn sẽ gặp lỗi sau:

TypeError: 'mã hóa' là một đối số từ khóa không hợp lệ cho chức năng này

1
Nhưng đây là phiên bản 3
SujitS

1
Vâng, tôi biết. Tôi nghĩ rằng nó có thể hữu ích cho những người sử dụngPython 2
Jeril

Làm việc cho tôi trong Python3 cũng vậy
fenkerbb

2
Trong trường hợp bạn muốn một cái gì đó dễ nhớ hơn, 'ISO-8859-1'còn được gọi là 'latin-1'hoặc 'latin1'.
Max Candocia

9

Bạn có thể giải quyết vấn đề với:

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

'rb' đang đọc tệp ở chế độ nhị phân. Đọc thêm ở đây . Hy vọng điều này sẽ giúp!


6

Những công việc này:

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

hoặc là:

open('filename',encoding="IS0-8859-1")

2

Nếu ai đó đang tìm kiếm những thứ này, đây là một ví dụ để chuyển đổi tệp CSV trong Python 3:

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

2

Đôi khi, open(filepath)trong đó filepaththực sự không phải là một tệp sẽ có cùng một lỗi, vì vậy trước tiên hãy đảm bảo rằng tệp bạn đang cố mở tồn tại:

import os
assert os.path.isfile(filepath)

hy vọng điều này sẽ giúp.


1

bạn có thể thử theo cách này:

open('u.item', encoding='utf8', errors='ignore')

Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ. - Từ đánh giá
MartenCatcher
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.