[resolu] rnettoyage de caractéres éè-,:' et autres sur une arbo

dimanche 26 avril 2015

J'ai réalise une nouvelle version du script python
special-rename.py. Elle est plus « pythonesque ». Finalement
on compile toutes les regexps, pour gagner en efficacité. Quand on
l'utilise sans arguments, le script affiche son usage et sort avec
un code de sortie non nul. Comme ça, ça sera plus clair.
Donc voici le script :


#! /usr/bin/python3
# -*- coding: utf-8 -*-

import re
from sys import argv, exit
import os
from os import rename, path

def special_sub(regexps, old_name):
    """regexps est le dictionnaire calculé par compile_regexps().
old_name esst une chaine de caractère unicode.
Retourne une nouvelle chaine qui correspond à l'application des
transformations des du dictionnaire regexps sur la chaine old_name."""

    new_name=old_name
    for k, v in regexps.items():
        if k != 'underscore':
            reg, repl=v
            new_name=reg.sub(repl, new_name)
    reg, repl=regexps['underscore']
    new_name=reg.sub(repl, new_name)
    return new_name

def compile_regexps():
    """Retourne un dictionnaire, les clefs sont les noms qui correspondent
à une regexp compilée. La valeur est un tuple de la regexp compilée et
de la chaine de remplacement"""

    dico={
        'cntrl': ('[\x00-\x19\x7F]', ''),
        'space': (r'\s+', '_'),
        'minus': (r"-+", '_'),
        'paren': (r"[()]+", '_'),
        'punct': (r"['\"?*:,;]", ''),
        'e': (r"[éèëê]", 'e'),
        'e_caps': (r"[ÉÈÊË]", 'E'),
        'a': (r"[àâä]", 'a'),
        'a_caps': (r"[ÀÂÄ]", 'A'),
        'i': (r"[ïî]", 'i'),
        'i_caps': (r"[ÏÎ]", 'I'),
        'o': (r"[öô]", 'o'),
        'o_caps': (r"[ÖÔ]", 'O'),
        'u': (r"[üûù]", 'u'),
        'u_caps': (r"[ÜÛÙ]", 'U'),
        'oe': (r"œ",'oe'),
         'oe_caps': (r"Œ",'OE'),
        'ae': (r"æ",'ae'),
        'ae_caps': (r"Æ",'AE'),
        'c': (r"Ç", 'C'),
        'c_caps': (r"ç", 'c'),
        'underscore': (r"_{2,}", '_'),
        }
    regexps=dict()
    for k, v in dico.items():
        s, repl=v
        regexps[k]=(re.compile(s, re.UNICODE), repl)
    return regexps
   
def usage():
    print("usage: {0} file [files…]".format(argv[0]))
    exit(1)

#### MAIN

if len(argv) == 1:
    usage()
# supprime le nom du script du tableau argv, seul les arguments
# m'intéresse ici.
argv.pop(0)
# précompile toutes les regexp
regexps=compile_regexps()
for old_name in argv:
    t = path.basename(old_name)
    d = path.dirname(old_name)
    t = special_sub(regexps,t)
    if len(d) == 0:
        new_name = t
    else:
        new_name = os.sep.join([d, t])
    try:
        if old_name != new_name and len(t) != 0 and not path.exists(new_name):
            rename(old_name, new_name)
            #print("{0} -> {1}".format(old_name, new_name))
        else:
            print("Impossible de renomer {0} en {1}".format(old_name, new_name))
    except OSError:
        print("Impossible de renommer {0} en {1}".format(old_name, new_name))
 

Voilà, d'après les quelques tests que j'ai faits, ça fonctionne.
EDIT: Au fait, c'est toujours du python3, désolé pour les utilisateurs python 2, je n'ai pas trouvé
de façon satisfaisante de le faire.



[resolu] rnettoyage de caractéres éè-,:' et autres sur une arbo

0 commentaires:

Enregistrer un commentaire

 

Lorem

Ipsum

Dolor