Debian Debian-France Debian-Facile Debian-fr.org Debian-fr.xyz Debian ? Communautés

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 Scripts, programmes et robots » [python] Problème de petits carrés dans des noms de fichiers » 19-12-2020 17:10:24

carlus
Réponses : 5
J'avais un problème dans des noms de fichiers qui s'affichaient dans Thunar avec des petits carrés à la place de la plupart des caractères accentués.
Les fichiers avaient été récupérés d'on ne sait où et impossible d'en connaître l'encodage d'origine vu qu'ils étaient déjà en UTF8.

Grâce au génie de Elzen, j'ai pu résoudre complètement le problème.
Il a fait un script qui corrige tous les caractères de façon récursive, nom de répertoire compris.
Je poste donc tout ça car j'ai beaucoup cherché avant et ce problème ne semble pas courant.

Il a fallu d'abord trouver le code que python3 trouvait pour chaque fichier qui posait problème.
Pour cela j'ai isolé chaque exemple de fichier dans un répertoire seul et passé la commande suivante qui affiche dans le retour le code en question à la place du caractère accenté :

os.listdir(".")[0].encode()



Ensuite, il faut enrichir le dictionnaire en début de script avec les bons codes et les bons caractères.

Il suffit enfin d'appeler le script avec la commande suivante :

python3 [nom du script] [chemin du repertoire racine à traiter]



Voici le script :

#! /usr/bin/python3
# coding: Utf-8

import os
import sys
import subprocess

converts = { b"\xc2\x82": "é",
             b"\xc2\x87": "ç",
             b"\xc2\x8a": "è",
             b"\xc2\x85": "à",
             b"\xc2\x83": "â" }

def rename(origin):
    target = origin.encode()
    for weird, valid in converts.items():
        target = subprocess.run(("tr", weird, valid),
            input=target, capture_output=True).stdout
    if target != origin.encode():
        subprocess.run(("mv", origin, target))
    target = target.decode()
    if os.path.isdir(target):
        for file in os.listdir(target):
            rename(os.path.join(target, file))

if __name__ == "__main__":
    for arg in sys.argv[1:]:
        rename(arg)



Le problème est donc résolu, en espérant qu'il pourra servir à quelqu'un d'autre.
Joyeux Noël à tous !

Pied de page des forums

Propulsé par FluxBB