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:
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.
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