Il s'inspire de "Comment créer un nom de fichier Windows valide à partir d'une chaîne arbitraire ?" J'ai écrit une fonction qui prend une chaîne arbitraire et en fait un nom de fichier valide.
Ma fonction devrait techniquement être une réponse à cette question, mais je veux m'assurer que je n'ai rien fait de stupide, ou oublié quelque chose, avant de la poster comme réponse.
J'ai écrit ceci dans le cadre de tvnamer - un utilitaire qui prend les noms de fichiers d'épisodes TV, et les renomme de façon agréable et cohérente, avec un épisode tiré de http://www.thetvdb.com - alors que le nom du fichier source doit être un fichier valide, le nom de la série est corrigé, ainsi que le nom de l'épisode - donc les deux peuvent théoriquement contenir n'importe quels caractères. Je ne suis pas tant préoccupé par la sécurité que par la facilité d'utilisation - c'est surtout pour éviter que les fichiers soient renommés .some.series - [01x01].avi
et le fichier qui "disparaît" (plutôt que de contrecarrer des personnes mal intentionnées)
Il fait quelques hypothèses :
- Le système de fichiers prend en charge les noms de fichiers Unicode. HFS+ et NTFS le font tous les deux, ce qui couvrira une majorité d'utilisateurs. Il existe également un
normalize_unicode
argument pour éliminer les caractères Unicode (dans tvnamer, ceci est défini via le fichier XML de configuration) - La plate-forme est soit Darwin, soit Linux, et tout le reste est traité comme Windows.
- Le nom de fichier est censé être visible (pas un fichier point comme
.bashrc
) - il serait assez simple de modifier le code pour permettre à.abc
formatez les noms de fichiers, si vous le souhaitez
Des choses que j'ai (heureusement) gérées :
- Faire précéder le trait de soulignement si le nom de fichier commence par
.
(empêche les noms de fichiers.
..
et les fichiers de disparaître) - Supprimer les séparateurs de répertoire :
/
sur Linux, et/
y:
sur OS X - Suppression des caractères non valides des noms de fichiers Windows
\/:*?"<>|
(sous Windows, ou forcé avecwindows_safe=True
) - Faire précéder les noms de fichiers réservés d'un trait de soulignement (
COM2
devient_COM2
,NUL
devient_NUL
etc) - Normalisation facultative des données Unicode, de sorte que
å
devienta
et les caractères non convertibles sont supprimés - Troncature des noms de fichiers de plus de 255 caractères sur Linux/Darwin, et de 32 caractères sur Windows
Le code et un certain nombre de cas de test peuvent être trouvés et manipulés à l'adresse suivante http://gist.github.com/256270 . Le code de "production" peut être trouvé dans tvnamer/utils.py
Y a-t-il des erreurs avec cette fonction ? Des conditions que j'ai manquées ?