Remplacement d’une chaîne de caractères dans tous les fichiers d’un répertoire.

Je pense que ce premier exemple, bien que très pratique, se passe d’explications tellement il est simple. Je vous invite donc à simplement lire le code.

Fonctions du script

  • Ouvre tous les fichiers d’un répertoire source
  • Lit les lignes du fichier ouvert, remplace la chaîne motif par la chaîne de remplacement
  • Ouvre un fichier du même nom que le fichier source dans le répertoire cible (en écriture) et y inscrit la chaîne transformée
  • Referme proprement les fichiers
#!/usr/bin/env python
#-*-coding: utf-8 -*-

'''Script de remplacement d'une chaîne par une autre dans plusieurs fichiers.
Usage : python rempl.py [options] [paramètres]

Options :
-h --help aide.....
-s --source= suivi du nom de repertoire source .......
-c --cible= suivi du nom de repertoire cible
-f suivi de la chaine a remplacer
-g suivi de la nouvelle chaine

Exemple :
python rempl.py -f "toto" -g "titi" -s data/source -c data/cible
'''
import getopt
import sys
import os
import os.path


def usage():
    print __doc__

def initialisation(argv):
    try:
        opts, args = getopt.getopt(argv, "hs:c:f:g:", ["help", "source=","cible="])
    except getopt.GetoptError:
        usage()                      
        sys.exit(2)
    string1,string2 = "",""
    source,cible = sys.path[0],sys.path[0]
    for opt, arg in opts:            
        if opt in ("-h", "--help"):  
            usage()                  
            sys.exit()               
        elif opt in ("-s", "--source"):
            source = arg
        elif opt in ("-c", "--cible"):
            cible = arg
        elif (opt == "-f"):
            string1 = arg
        elif (opt == "-g"):
            string2 = arg
    
    if string1 == "":
        print "Le texte a remplacer ne peut etre vide...\n"
        usage()
        sys.exit()
                
    if not os.path.isdir(source):
        print "source : ",source
        source = os.path.join(os.getcwd(),source)
        if not os.path.isdir(source):
            print "Le repertoire source est mal defini...\n"
            usage()
            sys.exit()
       
    if not os.path.isdir(cible):
        cible = os.path.join(os.getcwd(),cible)
        if not os.path.isdir(cible):
            print "Le repertoire cible est mal defini...\n"
            usage()
            sys.exit()
    source = os.path.abspath(source)
    cible = os.path.abspath(cible)
    
    if source == cible:
        print "Le repertoire source et le repertoire cible ne peuvent etre identiques..."
        sys.exit()
    print "source : ",source
    print "cible : ",cible
    print "chaine a remplacer : ",string1
    print "chaine de remplacement : ",string2
    choix = raw_input("Souhaitez-vous continuer (o/n) ? ")
    retour = [choix,source,cible,string1,string2]
    return retour

def remplace(source, cible, string1, string2):
    filelist = os.listdir(source)
    compteur = 0
    for myfile in filelist:
        soufile = os.path.join(source,myfile)
        if os.path.isfile(soufile):
            cifile = os.path.join(cible,myfile)
            opsoufile = open(soufile,'r')
            opcifile = open(cifile,'w')
            while 1:
                lig = opsoufile.readline()
                if lig == '':
                    break
                newlig = lig.replace(string1,string2)
                opcifile.write(newlig)
            opsoufile.close()
            opcifile.close()
            compteur += 1
    print compteur, " fichiers traités"


def main(argv):
    params = initialisation(argv)
    if (params[0] != "o"):
        print "Aucune donnée n'a été modifiée - Fin de script."
        sys.exit()
    else:
        remplace(params[1],params[2],params[3],params[4])

if __name__ == "__main__":
    main(sys.argv[1:])

Laisser un commentaire