2013-04-10 37 views
16

Tôi có khoảng 1000 tên tệp được đọc bởi os.listdir() một số mã được mã hóa 'utf-8' và một số là 'cp1252'.Python phát hiện mã hóa byte chuỗi

Tôi muốn giải mã tất cả chúng thành unicode để xử lý thêm trong tập lệnh của tôi. Có cách nào để có được mã hóa nguồn để giải mã chính xác vào unicode?

Ví dụ:

for item in os.listdir(rootPath): 

    #Convert to Unicode 
    if isinstance(item, str): 
     item = item.decode('cp1252') # or item = item.decode('utf-8') 
    print item 

Trả lời

22

nếu các tập tin của bạn, hoặc trong cp1252utf-8, sau đó là một cách dễ dàng.

import logging 
def force_decode(string, codecs=['utf8', 'cp1252']): 
    for i in codecs: 
     try: 
      return string.decode(i) 
     except UnicodeDecodeError: 
      pass 

    logging.warn("cannot decode url %s" % ([string])) 

for item in os.listdir(rootPath): 
    #Convert to Unicode 
    if isinstance(item, str): 
     item = force_decode(item) 
    print item 

nếu không, có bộ mã phát hiện lib.

Python - detect charset and convert to utf-8

https://pypi.python.org/pypi/chardet

+13

Tránh sử dụng dấu trống 'ngoại trừ:'. Nó bắt tất cả mọi thứ, ngay cả trường hợp ngoại lệ dựa trên hệ thống. Trong trường hợp này, ngoại trừ ngoại lệ: 'hoặc' ngoại trừ UnicodeError: 'có thể có ý nghĩa nhất. – twasbrillig

+3

Điểm tốt trên ô trống ngoại trừ, nhưng tôi tin rằng ngoại lệ đúng là 'UnicodeDecodeError' – guival

5

thư viện Sử dụng chardet. Nó là siêu dễ dàng

import chardet 

the_encoding = chardet.detect('your string')['encoding'] 

và đó là nó!

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