2012-04-16 7 views
8

Parece que no puedo abrir un archivo que tiene un nombre de archivo Unicode. Digamos que hago:abrir archivo con un nombre de archivo unicode?

for i in os.listdir(): 
    open(i, 'r') 

cuando trato de buscar alguna solución, siempre me páginas sobre cómo leer y escribir una cadena Unicode en un archivo, no cómo abrir un archivo con file() o open() que ha un nombre unicode

+2

El código que has publicado es la forma en que lo haría. ¿Qué pasa con eso? – kindall

+0

Sí, ¿qué pasa con ese código que no funciona? – agf

Respuesta

27

simplemente pasan open() una cadena Unicode para el nombre de archivo:

En Python 2.x:

>>> open(u'someUnicodeFilenameλ') 
<open file u'someUnicodeFilename\u03bb', mode 'r' at 0x7f1b97e70780> 

En Python 3.x, todas las cadenas son Unicode, por lo que literalmente no hay nada a ella .

Como siempre, tenga en cuenta que la mejor manera de abrir un archivo es siempre utilizando with statement junto con open().

Editar: En cuanto a los consejos os.listdir() nuevo varía, bajo Python 2.x, hay que tener cuidado:

os.listdir(), que devuelve los nombres de archivo, plantea una cuestión: ¿debe retorno la versión Unicode de nombres de archivos, o debería devolver cadenas de 8 bits que contienen las versiones codificadas? os.listdir() hará ambas cosas, dependiendo de si proporcionó la ruta del directorio como una cadena de 8 bits o una cadena Unicode. Si pasa una cadena Unicode como ruta, los nombres de archivo se decodificarán utilizando la codificación del sistema de archivos y se devolverá una lista de cadenas Unicode, mientras que al pasar una ruta de 8 bits se devolverán las versiones de 8 bits de los nombres de archivo.

Source

Así que en resumen, si quieres Unicode a cabo, poner en Unicode:

>>> os.listdir(".") 
['someUnicodeFilename\xce\xbb', 'old', 'Dropbox', 'gdrb'] 
>>> os.listdir(u".") 
[u'someUnicodeFilename\u03bb', u'old', u'Dropbox', u'gdrb'] 

Tenga en cuenta que el archivo todavía se abrirá en cualquier caso - no va a ser representada dentro Python, ya que será una cadena de 8 bits, pero seguirá funcionando.

open('someUnicodeFilename\xce\xbb') 
<open file 'someUnicodeFilenameλ', mode 'r' at 0x7f1b97e70660> 

En virtud de 3.x, como siempre, siempre es Unicode.

+1

¿Qué sucede si utilizo algo como 'os.listdir()', no creando las cadenas de Unicode yo mismo? –

+0

Me imagino que si tiene un sistema de archivos compatible con Unicode, os.listdir() devolverá las cadenas de Unicode. –

+1

@ user975135 Editado para agregar una nota sobre Python 2.x y '' os.listdir() '' con Unicode. –

7

Puede probar esto:

import os 
import sys 

for filename in os.listdir(u"/your-direcory-path/"): 
    open(filename.encode(sys.getfilesystemencoding()), "r") 
Cuestiones relacionadas