2012-04-16 7 views
8

Je ne semble pas être en mesure d'ouvrir un fichier qui a un nom de fichier unicode. Disons que je fais:ouvrir le fichier avec un nom de fichier unicode?

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

Lorsque je tente de chercher une solution, je reçois toujours des pages sur la façon de lire et d'écrire une chaîne de caractères Unicode dans un fichier, pas comment ouvrir un fichier avec file() ou open() qui a un nom unicode.

+2

Le code que vous avez posté est comment je le ferais. Qu'est ce qui ne va pas avec ça? – kindall

+0

Oui, qu'en est-il de ce code ne fonctionne pas? – agf

Répondre

27

Il suffit de passer open() une chaîne de caractères Unicode pour le nom du fichier:

En Python 2.x:

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

3.x Python, toutes les chaînes sont Unicode, donc il n'y a littéralement rien à ce .

Comme toujours, notez que la meilleure façon d'ouvrir un fichier est toujours d'utiliser le with statement en conjonction avec open().

Edit: En ce qui concerne les conseils os.listdir() varie de nouveau, sous Python 2.x, vous devez être prudent:

os.listdir(), qui renvoie les noms de fichiers, soulève une question: faut-il revenir la version Unicode des noms de fichiers, ou devrait-il retourner des chaînes de 8 bits contenant les versions codées? os.listdir() fera les deux, selon que vous avez fourni le chemin du répertoire sous la forme d'une chaîne de 8 bits ou d'une chaîne Unicode. Si vous passez une chaîne Unicode comme chemin, les noms de fichiers seront décodés en utilisant le codage du système de fichiers et une liste de chaînes Unicode sera renvoyée, tandis qu'un chemin de 8 bits retournera les versions 8 bits des noms de fichiers.

Source

Donc en bref, si vous voulez Unicode sur, mettre en Unicode:

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

Notez que le fichier sera toujours ouvert de toute façon - il ne sera pas représenté bien à l'intérieur Python car ce sera une chaîne de 8 bits, mais ça marchera toujours.

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

Sous 3.x, comme toujours, il est toujours Unicode.

+1

Que se passe-t-il si j'utilise quelque chose comme 'os.listdir()', sans créer moi-même les chaînes Unicode? –

+0

J'imagine que si vous avez un système de fichiers supportant Unicode, os.listdir() retournera des chaînes Unicode. –

+1

@ user975135 Édité pour ajouter une note à propos de Python 2.x et '' os.listdir() '' avec Unicode. –

7

Vous pouvez essayer ceci:

import os 
import sys 

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