Convertir python noms de fichiers en unicode
Je suis sur la version 2.6 de python pour Windows.
- Je utiliser os.marche pour la lecture d'un fichier de l'arborescence. Les fichiers peuvent avoir des non-caractères 7 bits (en allemand "ae" par exemple) dans leur nom de fichier. Ces sont codées dans les Pythons interne de la représentation sous forme de chaîne.
Je suis le traitement de ces noms de fichiers avec Python fonctions de la bibliothèque et qui échoue en raison d'un mauvais encodage.
Comment puis-je convertir ces fichiers au bon (unicode?) python cordes?
J'ai un fichier "d:\utest\ü.txt". En passant le chemin d'accès en unicode ne fonctionne pas:
>>> list(os.walk('d:\\utest'))
[('d:\\utest', [], ['\xfc.txt'])]
>>> list(os.walk(u'd:\\utest'))
[(u'd:\\utest', [], [u'\xfc.txt'])]
- Il NE fonctionne pas: Regardez votre sortie!! À la fois le nom du répertoire u'd:\\utest" et le nom de fichier u'\xfc.txt "sont présentées comme des objets unicode u'blahblah " au lieu de la précédente str objets blahblah'. Peut-être le fait que les u-avec-tréma est représenté par \xfc est ahurissant vous, mais c'est la même chose avec les str comme avec unicode et n'a rien à voir avec le str/unicode problème.
- Peut-être vous avez besoin d'amplifier les "échoue en raison d'un mauvais encodage" ... Ce qui ne parvient pas? Comment? Montrer l'intégralité de la traçabilité en amont et message d'erreur.
Vous devez vous connecter pour publier un commentaire.
Si vous passez une chaîne Unicode en
os.walk()
, vous aurez Unicode résultats:Je cherchais une solution pour Python 3.0+. Va le mettre en place ici au cas où quelqu'un d'autre en a besoin.
SyntaxError
en Python. 2. Le code dans la réponse transmisebytes
àos.walk()
et, par conséquent, les noms de fichiers sont produites en octets. Vous devriez utiliser l'Unicode (drop.encode()
appel) à la place. L'OP est confus. En passant Unicode est la bonne chose sur Windows.TypeError: os.scandir() doesn't support bytes path on Windows, use Unicode instead
une façon plus directe, peut être essayer le suivant-trouver votre fichier du système de codage, et ensuite de les convertir au format unicode. par exemple,
aller dans l'autre sens,
os.marche
n'est pas spécifié de toujours utiliseros.listdir
, mais il n'est ni listé comment Unicode est pris en charge. Cependant,os.listdir
dit:Est-ce tout simplement à l'aide d'une Unicode argument de travail pour vous?
Non, ils ne sont pas codés dans les Pythons interne de la représentation de chaîne, il n'y a pas une telle chose. Ils sont encodés dans le codage du système d'exploitation/système de fichiers. De passage en unicode fonctionne pour les os.marche bien.
Je ne sais pas comment os.pied se comporte quand les noms de fichiers ne peut pas être décodé, mais je suppose que vous allez obtenir une chaîne de caractères en arrière, comme avec les os.listdir(). Dans ce cas, vous allez de nouveau avoir des problèmes plus tard. Aussi, pas tous de Python 2.x de la bibliothèque standard accepte unicode paramètres correctement, de sorte que vous pouvez avoir besoin de coder comme des chaînes de toute façon. Donc, le problème peut en fait être quelque part d'autre, mais vous remarquerez que si c'est le cas. 😉
Si vous avez besoin de plus de contrôle sur le décodage, on ne peut pas passer dans une chaîne de caractères, et puis il suffit de le décoder avec
filename = nom de fichier.decode()
comme à l'habitude.