2012-05-07 58 views
16

Tôi tiếp tục gặp lỗi này khi đang đọc tệp văn bản. Có thể xử lý/bỏ qua nó và tiếp tục không?Xử lý lỗi Unicode với readline của Python 3()

UnicodeEncodeError: ‘charmap’ codec can’t decode byte 0x81 in position 7827: character maps to undefined.

+1

Điều này thay đổi _lot_ dựa trên chi tiết. Python 2? Python 3? Bạn đang cố giải mã các chuỗi bạn đã đọc chưa? Làm sao? Vv –

+0

Python 3. Tôi đang sử dụng readlines() – Bob

+0

OK - cập nhật câu hỏi để chỉ định Python 3. Unicode là một trong những nơi có sự khác biệt rất lớn giữa 2 và 3; hãy đảm bảo chỉ định phiên bản rõ ràng trong tương lai. –

Trả lời

30

Trong Python 3, vượt qua một giá trị thích hợp errors= (như errors=ignore hoặc errors=replace) vào việc tạo ra đối tượng tập tin của bạn (giả sử nó là một lớp con của io.TextIOWrapper - và nếu nó không phải là, hãy xem xét gói nó trong một!); Ngoài ra, hãy xem xét việc chuyển mã hóa có khả năng nhiều hơn charmap (khi bạn không chắc chắn, utf-8 luôn là nơi tốt để bắt đầu).

Ví dụ:

f = open('misc-notes.txt', encoding='utf-8', errors='ignore') 

Trong Python 2, hoạt động read() chỉ đơn giản trả về byte; các trick, sau đó, là giải mã chúng để có được chúng thành một chuỗi (nếu bạn làm, trên thực tế, muốn ký tự như trái ngược với byte). Nếu bạn không có một đoán tốt hơn để mã hóa thật của họ:

your_string.decode('utf-8', 'replace') 

... để thay thế unhandled ký tự, hoặc

your_string.decode('utf-8', 'ignore') 

chỉ đơn giản là bỏ qua chúng.

Điều đó nói rằng, việc tìm và sử dụng mã hóa thực sự của mình (thay vì đoán utf-8) sẽ được ưu tiên.

+0

Nitor nhỏ: trong Python 2, mẹo là * giải mã * chúng, không mã hóa. Nhưng bạn biết điều đó, bởi vì bạn đang gọi phương thức 'decode'. –

+0

@ThomasK cảm ơn, đã sửa. –

+0

Không hoàn toàn: "lừa, sau đó, mã hóa chúng ..." –

-1

Yeah..you có thể bọc nó trong một

try: 
    .... 
except UnicodeEncodeError: 
    pass 
+0

chỉ cần bắt UnicodeEncodeError – cobie

+2

có, nhưng điều đó không giúp ích nhiều cho việc giải thích cách tiếp tục đọc phần còn lại của tệp. –

1

Bạn nên mở tệp bằng codec để đảm bảo tệp được hiểu là UTF8.

 
import codecs 
fd = codecs.open(filename,'r',encoding='utf-8') 
data = fd.read()