2010-03-01 12 views
11

Supongamos que estoy leyendo un archivo que contiene 3 números separados por comas. El archivo se guardó con una codificación desconocida, hasta ahora estoy lidiando con ANSI y UTF-8. Si el archivo estaba en UTF-8 y tenía 1 fila con los valores 115,113,12 entonces:Tratar con números UTF-8 en Python

with open(file) as f: 
    a,b,c=map(int,f.readline().split(',')) 

tiraría esto:

invalid literal for int() with base 10: '\xef\xbb\xbf115' 

El primer número es siempre destrozado con estos '\ XEF \ xbb \ xbf 'personajes. Para el resto, 2 números la conversión funciona bien. Si reemplazo manualmente '\ xef \ xbb \ xbf' con '' y luego realizo la conversión int, funcionará.

¿Hay una forma mejor de hacerlo para cualquier tipo de archivo codificado?

Respuesta

17
import codecs 

with codecs.open(file, "r", "utf-8-sig") as f: 
    a, b, c= map(int, f.readline().split(",")) 

Esto funciona en Python 2.6.4. La llamada codecs.open abre el archivo y devuelve datos como unicode, descodifica desde UTF-8 e ignora la lista de materiales inicial.

+0

Gracias. Esto funciona en mis archivos UTF-8 pero falla en Unicode y Unicode big endian. ¿Hay alguna manera infalible de abrir cualquier tipo de archivo codificado y obtener esos números o tendría que especificar explícitamente la codificación? –

+0

AFAIK tiene que especificar la codificación. Obviamente, puede escribir una pequeña función que haga las tres pruebas y devuelva un archivo decodificado apropiadamente. – tzot

+0

Genial. Encontré el módulo chardet que hace exactamente este http://chardet.feedparser.org/ –

13

Lo que está viendo es una codificación UTF-8 BOM, o "Marca de orden de bytes". La lista de materiales no se utiliza generalmente para archivos UTF-8, por lo que la mejor manera de manejarlo podría ser abrir el archivo con un códec UTF-8 y omitir el carácter U+FEFF, si está presente.