2013-04-10 14 views
16

Ho circa 1000 nomi di file letti da os.listdir() alcuni di questi sono codificati 'utf-8' e alcuni sono 'cp1252'.Python rileva codifica byte stringa

Voglio decodificarli tutti in Unicode per un'ulteriore elaborazione nel mio script. C'è un modo per ottenere la codifica sorgente per decodificare correttamente in unicode?

Esempio:

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 

risposta

22

se i file sia in cp1252 e utf-8, poi c'è un modo semplice.

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 

in caso contrario, esiste una lib di rilevamento charset.

Python - detect charset and convert to utf-8

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

+13

Evitare l'uso di uno spazio vuoto 'tranne:'. Cattura tutto, anche le eccezioni basate sul sistema. In questo caso, ad eccezione di Exception: 'o' except UnicodeError: 'può essere più sensato. – twasbrillig

+3

Buon punto sullo spazio bianco tranne, ma credo che l'eccezione corretta sia 'UnicodeDecodeError' – guival

5

biblioteca Usa chardet. È super facile

import chardet 

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

e il gioco è fatto!