2013-06-02 28 views
6

Tôi có số này myfile (mà tôi đã dán, tôi hy vọng dữ liệu có liên quan với các sự cố đã tồn tại khi sao chép/dán). Tôi cố gắng đọc rằng tập tin với:Cách đọc "nguồn C, văn bản ISO-8859"

import codecs 
codecs.open('myfile', 'r', 'utf-8').read() 

Nhưng điều này mang lại:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xe5 in position 7128: invalid continuation byte 

Nếu tôi kiểm tra các tập tin:

» file myfile 
myfile: C source, ISO-8859 text 
  • Làm thế nào tôi có thể đọc rằng loại tập tin (ISO-8859) trong python?
  • Trong trường hợp chung, làm cách nào để biết tệp được mã hóa như thế nào?

Rất nhiều lần tôi đang xử lý các tệp chưa được tạo bởi tôi (tệp hệ thống, tệp ngẫu nhiên được tải xuống từ internet, tệp ngẫu nhiên do nhà cung cấp, khách hàng, ...) cung cấp: một đầu mối của mã hóa họ đang sử dụng. Đang ở trong một môi trường đa văn hóa (Châu Âu), rất khó để biết cách các tệp đó được mã hóa như thế nào. Hầu hết các lần, ngay cả những người cung cấp các tập tin không có đầu mối về mã hóa, có thể xảy ra đằng sau hậu trường của trình soạn thảo/công cụ lựa chọn. Làm thế nào để chắc chắn về mã hóa đang được sử dụng, trên cơ sở từng tệp?

+0

Các tập tin mà bạn đưa vào pastebin.com không giữ lại các byte bạn gặp vấn đề với. –

+0

Lạ: kiểm tra trực quan cho tôi biết họ đang ở đó (dòng 151) – dangonfast

+0

Ah, thực sự, nhưng dữ liệu được mã hóa UTF8, vì vậy mã hóa Latin-1 tôi đã mở tệp mà không bận tâm, cũng như UTF8 không thành công. :-) Trình duyệt của bạn phải điều chỉnh mã hóa sau khi sử dụng trình phỏng đoán riêng của nó. –

Trả lời

9

Bạn thay đổi codec trong lệnh open(); tiêu chuẩn ISO-8859 có nhiều codec, tôi nhặt Latin-1 cho các bạn ở đây, nhưng bạn có thể cần phải chọn một trong khác:

codecs.open('myfile', 'r', 'iso-8859-1').read() 

Xem codecs module cho một danh sách các codec hợp lệ. Đánh giá bởi dữ liệu pastie, iso-8859-1 là codec chính xác để sử dụng, vì nó phù hợp cho văn bản Scandinavia.

Nói chung, không có các nguồn khác, bạn không thể biết codec sử dụng tập tin nào. Tốt nhất, bạn có thể đoán (đó là những gì file hiện).

+0

Cảm ơn. Điều này thực sự không may. Đây có phải là lỗ hổng thiết kế của unicode không? Tôi có nghĩa là, có một tập tin được mã hóa, nhưng không có cách nào để nói những gì mã hóa các tập tin sử dụng đình công tôi như là một thiếu sót nghiêm trọng. Khi công cụ của tôi chạy trong sản xuất, tôi sẽ không ở đó để thay đổi codec theo cách thủ công. Tôi có phải giữ bản đồ * riêng biệt của 'tệp: mã hóa' không? Tôi có nên * luôn luôn * thử danh sách các codec có thể không? Tôi có thể có dương tính giả không? – dangonfast

+0

Điều này không liên quan gì đến Unicode; đó là một lỗ hổng của định dạng tệp để không bao gồm codec được sử dụng. Nếu bạn đã thử tất cả các codec, bạn * sẽ * chạy vào các mặt tích cực sai, có, nhiều khả năng hơn là nhấn một codec đúng trên thực tế. Bạn có thể sử dụng ['chardet'] (https://pypi.python.org/pypi/chardet) để cố gắng đưa ra một dự đoán có học thức hơn. –

+0

Mmmm. Đúng. Một lỗ hổng của định dạng tệp * khi * sử dụng unicode. Mở một tập tin không unicode * không bao giờ * gây rắc rối. Đó là những gì (sai?) Mang lại cho tôi cảm giác rằng unicode là thủ phạm. Tôi nghĩ rằng nó đã là một lỗi để bắt đầu phân phối các tập tin mã hóa unicode mà không cần nhúng thông tin về các codec được sử dụng. – dangonfast

8

Với python 3.3 bạn có thể sử dụng được xây dựng trong chức năng mở

open("myfile",encoding="ISO-8859-1") 
+1

Tôi mất 15 phút để tìm được giải pháp đơn giản này. Cảm ơn! –

Các vấn đề liên quan