Partage
  • Partager sur Facebook
  • Partager sur Twitter

Traitement sur des fichiers/répertoires windows

    22 février 2012 à 12:06:55

    Bonjour,

    Je n'ai quasiment jamais vu une ligne de python de ma vie, mais il semble d'après l'aide de certains internautes sur ce forum, que ce soit le langage le plus adapté à mon besoin actuel. J'espère que vous pourrez m'apporter un peu d'aide. Merci d'avance pour la lecture de ce long et fastidieux post :)

    Voici d'un point de vue fonctionnel (et un peu algo) ce que je cherche à faire:

    Dans le cadre de mon travail, je reçoit tous les jours dans un répertoire O:\Racine\Rep1, un certain nombre de fichiers dont le nom suit une logique précise :
    TR_refXX_date.txt
    TR_refXX_date.csv


    date est la date du jour, XX est un nombre compris entre 01 et 99 (il n'y a pas forcément tous les nombres compris dans cet intervalle).

    Je voudrais faire deux opérations:
    Copier tous les fichiers .csv vers un autre répertoire d'un autre disque (K:\Racine\Rep2).
    Une fois que ceci est réalisé, je veux couper tous les fichiers (.csv et .txt) vers un autre répertoire, pour archivage. Mais c'est là que le nombre XX est important. Le duo .csv + .txt contenant XX, doit aller dans (O:\Racine\Archiv\XX).

    J'imagine que ça doit se passe un peut comme ça :

    Opération 1

    while (tous les fichiers n'ont pas été scannés)
    current file
    copy file (filename = "*.csv",K:\Racine\Rep2)
    goto next file

    Opération 2

    while (tous les fichiers n'ont pas été scannés)
    current file
    chaine XX = "septième et huitième caractère de mon fichier"
    if (O:\Racine\Archiv\XX existe):
    cut/paste (file, O:\Racine\Rep1, O:\Racine\Archiv\XX)
    else:
    create O:\Racine\Archiv\XX
    cut/paste (file, O:\Racine\Rep1, O:\Racine\Archiv\XX)
    goto next file

    Je m'excuse d'avance pour la lisibilité de tout ça (surout que je n'ai pas réussi à indenter mon "code". J'espère que c'est à peu près clair. :-°

    Merci de votre aide!
    • Partager sur Facebook
    • Partager sur Twitter
      22 février 2012 à 17:09:11

      C'est assez clair ;) Mauvaise nouvelle pour toi je pense que personne ne va te le faire, bonne nouvelle par contre comme tu as bien réfléchi à ton problème on va pouvoir t'aider et te donner des pistes:
      - glob.glob: à utiliser pour parcourir facilement tout les noms de fichier d'un répertoire
      - shutil.copy: pour copier les fichiers
      - shutil.move: pour "couper" les fichiers
      - .endswith(): une méthode des chaînes de caractères pour savoir si tu as à faire à un csv ou un txt
      - pour récupérer les chiffres (si t'es sûr qu'il y a toujours deux chiffres, sinon utilise une régex):
      >>> s = 'TR_refXX_date.txt'
      >>> s[6:8]
      'XX'
      


      Avec tout ça et un peu de recherche sur Python tu devrais pas avoir trop de mal à faire ce que tu veux (surtout que j'ai l'impression que tu as déjà un peu codé à cause du while/if/else).

      Edit:
      - os.mkdir: pour créer les dossiers
      • Partager sur Facebook
      • Partager sur Twitter
        22 février 2012 à 21:50:28

        colle ce module (path.py) dans le répertoire de ton programme python :
        https://github.com/dottedmag/path.py/blob/master/path.py

        et ajoute "from path import path" au début de ton programme.

        lis la doc (elle est dans le code).

        voilà un point de départ (non testé) :

        from path import path
        import re
        
        SOURCE = r'O:\Racine\Rep1'
        DEST = r'K:\Racine\Rep2'
        ARCHIVE = r'O:\Racine\Archiv\XX'
        
        # analyse un nom de fichier et vérifie qu'il est correct
        #
        def parse( fname ):
            m = re.match( r'^TR_ref(\d+)_(\d{4}-\d{2}-\d{2})\.(csv|txt)', fname )
            if not m: 
                print "%s a une sale gueule" % fname
                return None
            ref, date, ext = m.groups()
            return ref, date, ext
        
        #
        def run( dir ):
            # récupère les noms de fichiers
            csvs = dict( (file.namebase,file) for file in dir.glob( "*.csv" ) )
            txts = dict( (file.namebase,file) for file in dir.glob( "*.txt" ) )
            
            # vérifie que toutes les paires de fichiers (csv+txt) sont des paires
            if set(csvs) != set(txts):
                print "manque des csv ou txt ; liste des célibataires :"
                print set(csvs).symmetric_difference(txts)
        
            # go
            for doit in 0,1:
                for k, csv in csvs:
                    txt = txts[k]
                    ref, date, ext = parse( csv.basename() )
                    
                    # copie le csv
                    dest = DEST / csv.basename()
                    print "copy %s => %s" % (csv, dest)
                    if doit:
                        path.copy( csv, dest )
                        
                    # déplace les 2
                    for p in txt, csv:
                        dest = ARCHIVE / ref / p.basename()
                        print "copy %s => %s" % (p, dest)
                        if doit:
                            path.copy( p, dest )
                
                if not doit:
                    raw_input( "OK ? Ctrl-C pour annuler" )
        
        run()
        
        • Partager sur Facebook
        • Partager sur Twitter
          22 février 2012 à 23:19:03

          Citation : Lord Casque Noir

          colle ce module (path.py) dans le répertoire de ton programme python :
          https://github.com/dottedmag/path.py/blob/master/path.py

          et ajoute "from path import path" au début de ton programme.



          Par curiosité : quel est ce module, et que fait il ? Pourquoi la lib standard ne suffit pas ici ?
          • Partager sur Facebook
          • Partager sur Twitter
            23 février 2012 à 8:09:01

            La lib standard suffit, ce module est juste extrêmement pratique.
            • Partager sur Facebook
            • Partager sur Twitter

            Traitement sur des fichiers/répertoires windows

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown