2013-04-10 11 views
16

Mam około 1000 nazw plików odczytanych przez os.listdir() niektóre z nich są zakodowane "utf-8", a inne to "cp1252".Kod bajtowy wykrywający język Python

Chcę rozszyfrować wszystkie z nich do Unicode do dalszego przetwarzania w moim skrypcie. Czy istnieje sposób, aby kodowanie źródłowe poprawnie zdekodować w Unicode?

Przykład:

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 

Odpowiedz

22

jeśli pliki albo w cp1252 i utf-8, to istnieje prosty sposób.

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 

w przeciwnym razie istnieje zestaw znaków char wykrywania.

Python - detect charset and convert to utf-8

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

+13

Unikaj pustego 'except:'. Łapie wszystko, nawet wyjątki systemowe. W tym przypadku 'except Exception:' lub 'except UnicodeError:' może mieć największy sens. – twasbrillig

+3

Dobry punkt na pustym miejscu oprócz, ale uważam, że właściwym wyjątkiem jest 'UnicodeDecodeError' – guival

5

Zastosowanie chardet biblioteka. To jest bardzo łatwe:

import chardet 

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

i to wszystko!

Powiązane problemy