Contournement de l’encodage du nom de fichier

Vous souhaitez effectuer des opérations d’E/S de fichiers à l’aide de noms de fichiers bruts qui n’ont pas été décodés ou encodés conformément à l’encodage par défaut des noms de fichiers de votre système d’exploitation.

Par défaut, tous les noms de fichiers sont encodés et décodés selon l’encodage texte renvoyé par sys.getfilesystemencoding(). Par exemple:

>>> sys.getfilesystemencoding()
'utf-8'
>>>

 

Si vous voulez contourner cet encodage pour une raison quelconque, spécifiez un nom de fichier en utilisant une chaîne d’octets brute à la place. Par exemple:

>>> # Ecrire un fichier en utilisant un nom de fichier unicode
>>> with open('Sape\xf1o.txt', 'w') as f:
... f.write('Kolly!')
...
6

>>> # Listage de répertoires (décodé)
>>> import os
>>> os.listdir('.')
['Sapeño.txt']

>>> # Listage de répertoires (brute)
>>> os.listdir(b'.') # NB: chaîne d'octets
[b'Sapen\xcc\x83o.txt']

>>> # Ouvrir le fichier avec un nom de fichier brut
>>> with open(b'Sapen\xcc\x83o.txt') as f:
... print(f.read())
...
Kolly!
>>>

 

Comme vous pouvez le voir dans les deux dernières opérations, la manipulation du nom de fichier change légèrement lorsque des chaînes d’octets sont fournies à des fonctions liées aux fichiers, telles que open() et os.list dir().

Dans des circonstances normales, vous ne devriez pas avoir à vous soucier de l’encodage et du décodage des noms de fichiers – les opérations normales de décodage des noms de fichiers devraient simplement fonctionner.

Cependant, de nombreux systèmes d’exploitation peuvent permettre à un utilisateur, par accident ou malveillance, de créer des fichiers dont les noms ne sont pas conformes aux règles d’encodage attendues.

De tels noms de fichiers peuvent mystérieusement bloquer les programmes Python qui fonctionnent avec un grand nombre de fichiers.

Lire des répertoires et travailler avec des noms de fichiers en tant qu’octets bruts non décodés a le potentiel d’éviter de tels problèmes, mais au prix de la commodité de la programmation.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here