2017-09-03 3 views
0

Dans un répertoire dans Windows j'ai 2 fichiers, tous les deux avec un caractère accentué dans son nom: t1û.fn et t2ű.fn; La commande dir dans l'invite de commande montre à la fois correctement:ouvrir un fichier avec un caractère accentué dans son nom, en Python 2 sur Windows

S:\p>dir t*.fn 
Volume in drive S is q 
Volume Serial Number is 05A0-8823 

Directory of S:\p 

2017-09-03 14:54     4 t1û.fn 
2017-09-03 14:54     4 t2ű.fn 
       2 File(s)    8 bytes 
       0 Dir(s) 19,110,621,184 bytes free 

Screenshot:

screenshot of dir

Cependant, Python ne peut pas voir les deux fichiers:

S:\p>python -c "import os; print [(fn, os.path.isfile(fn)) for fn in os.listdir('.') if fn.endswith('.fn')]" 
[('t1\xfb.fn', True), ('t2u.fn', False)] 

Il ressemble à Python 2 utilise une API à un octet pour les noms de fichiers, ainsi le caractère accentué dans t1û.fn est mappé sur le seul octet \xfb, et l'acce Le caractère affiché dans t2ű.fn est mappé sur l'octet unique ASCII non accentué u.

Comment est-il possible d'utiliser une API multi-octets pour les noms de fichiers sous Windows en Python 2? Je veux ouvrir les deux fichiers dans la version console de Python 2 sous Windows.

+0

Pour votre information, si vous faites le saut vers Python 3, notez que les chemins 'bytes' ont été désapprouvés sous Windows à cause de ce comportement. La prise en charge des chemins 'bytes' renvoyés dans 3.6+ en prétendant que le codage du système de fichiers est UTF-8. Dans 3.6, vous pouvez ouvrir 'b't1 \ xc3 \ xbb.fn'' en plus de' 't1û.fn" ', et' os.listdir (b '.') 'Code les noms de fichiers en UTF-8. En interne, il transcodé en UTF-16 pour utiliser l'API de caractères larges Windows. – eryksun

Répondre

1

Utilisez une chaîne unicode:

f1 = open(u"t1\u00fb.fn")  # t1û.fn 
f2 = open(u"t2\u0171.fn")  # t2ű.fn 
+0

Merci, ça marche pour 'open'. Aussi 'os.listdir (u '.')' Renvoie les noms de fichiers avec les caractères accentués à droite. – pts