2012-04-16 12 views
8

Non riesco ad aprire un file con un nome file unicode. Consente di dire che faccio:apre un file con un nome file unicode?

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

Quando provo a cercare qualche soluzione, ho sempre arrivare pagine su come leggere e scrivere una stringa unicode in un file, non è come aprire un file con file() o open() che ha un nome unicode.

+2

Il codice che hai postato è come lo farei. Che cosa c'è che non va? – kindall

+0

Sì, che dire di quel codice non funziona? – agf

risposta

27

semplicemente passare open() una stringa unicode per il nome del file:

In Python 2.x:

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

In Python 3.x, tutte le stringhe sono Unicode, quindi non c'è letteralmente nulla ad esso .

Come sempre, si noti che il modo migliore per aprire un file è sempre quello di utilizzare with statement insieme a open().

Edit: Per quanto riguarda il consiglio os.listdir() varia di nuovo, sotto Python 2.x, bisogna stare attenti:

os.listdir(), che restituisce i nomi dei file, solleva un problema: dovrebbe ritorno la versione Unicode dei nomi di file o dovrebbe restituire stringhe a 8 bit contenenti le versioni codificate? os.listdir() farà entrambe le cose, a seconda che tu abbia fornito il percorso della directory come una stringa da 8 bit o una stringa Unicode. Se si passa una stringa Unicode come percorso, i nomi dei file verranno decodificati utilizzando la codifica del file system e verrà restituito un elenco di stringhe Unicode, mentre il passaggio di un percorso a 8 bit restituirà le versioni a 8 bit dei nomi file.

Source

Così, in breve, se si vuole Unicode fuori, messo in Unicode:

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

Si noti che il file verrà comunque aprire in entrambi i casi - non sarà rappresentato ben all'interno Python come sarà una stringa a 8 bit, ma funzionerà ancora.

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

Sotto 3.x, come sempre, è sempre Unicode.

+1

Cosa succede se uso qualcosa come 'os.listdir()', non creando personalmente le stringhe Unicode? –

+0

Immagino che se hai un filesystem di supporto Unicode, os.listdir() restituirà le stringhe Unicode. –

+1

@ user975135 Modificato per aggiungere una nota su Python 2.xe '' os.listdir() '' con Unicode. –

7

si può provare questo:

import os 
import sys 

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