2012-02-29 10 views
5

Con un nombre de archivo que parece:Python abierta() Unicode comportamiento de nombre de archivo diferentes sistemas operativos a través de

filename = u"/direc/tories/español.jpg" 

Y usando abierta() como:

fp = open(filename, "rb") 

Esto abrirá correctamente el archivo en OSX (10.7), pero en Ubuntu 11.04 la función open() intentará abrir u"espa\xf1ol.jpg", y esto fallará con un IOError.

A través del proceso de intentar solucionar esto, he comprobado sys.getfilesystemencoding() en ambos sistemas, ambos están configurados en utf-8 (aunque Ubuntu informa en mayúsculas, es decir, UTF-8, no estoy seguro si eso es relevante). También configuré # -*- coding: utf-8 -*- en el archivo python, pero estoy seguro de que esto solo afecta a la codificación dentro del archivo, no a las funciones externas ni a la forma en que python maneja los recursos del sistema. El archivo existe en ambos sistemas con la eñe correctamente visualizada.

La pregunta final es: ¿Cómo abro el archivo español.jpg en el sistema Ubuntu?

Editar: La cadena español.jpg en realidad proviene de una base de datos a través de ORM de Django (ImageFileField), pero por el momento estoy tratando con él y ver la diferencia en el comportamiento tengo una sola cadena Unicode que es un absoluto ruta al archivo.

+1

Por lo que vale, '" \ xf1 "' es la representación ISO-8859-1 de '" ñ "'. –

+3

FYI, toqué un archivo llamado 'español.jpg' y lo abrí a su manera y funcionó correctamente en mi Arch Linux. ¿Podría pegar la salida 'locale' de su Ubuntu? –

+0

'locale' da' en_US.UTF-8' para un número de parámetros que incluyen 'LANG'. – mrmagooey

Respuesta

2

Ésta continuación debería funcionar en ambos casos:

fp = open(filename.encode(sys.getfilesystemencoding()), "rb") 
+0

'sys.getfilesystemencoding' es un poco mentira: en muchas plataformas (te estoy mirando, UNIX), el sistema de archivos no tiene una codificación, sino solo bytes. Las aplicaciones, no el sistema de archivos, definen las codificaciones utilizadas para representar los nombres de los archivos, si los nombres de los archivos son texto. –

+2

Esto no funcionaría en Windows porque 'getfilesystemencoding' en realidad no informa la codificación del sistema de archivos (UTF-16). Nunca hagas esto si quieres ser independiente de la plataforma. – Philipp

+1

Pero obtengo 'mbcs' en windows usando' getfilesystemencoding', que maneja el sistema de archivos de Windows correctamente. –

1

No es suficiente simplemente establecer la codificación de archivos en la parte superior de su archivo. Asegúrese de que su editor esté usando la misma codificación y guarde el texto en esa codificación. Si es necesario, vuelva a escribir los caracteres que no sean ASCI para asegurarse de que su editor está haciendo lo correcto.

Si su valor proviene de, por ejemplo, una base de datos, aún deberá asegurarse de que en ninguna parte de la línea se codifique como no unicode.

+1

+1 para esto, verifique la configuración de su editor. –

+0

Disculpe, ¿debería haber agregado la información de edición desde el principio que creo que probablemente debería negar los problemas de codificación del editor ...? – mrmagooey

+0

@mrmagooey: Sí, pero tenga en cuenta que todavía necesita asegurarse de no codificar la cadena de una manera diferente en algún punto de la línea. – Marcin

Cuestiones relacionadas