IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Progress bar lors de la copie d'un fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut Progress bar lors de la copie d'un fichier
    Bonjour à tous,

    Je souhaite intégrer au code ci dessous une barre de progression me permettant de savoir l'état d'avancement de mes copies de fichiers.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    # -*- coding: cp1252 -*-
    import os
    import shutil
     
    root_src_dir = 'F:\PATH_SOURCE'
    root_dst_dir = 'D:\PATH_DESTINATION'
     
    for src_dir, dirs, files in os.walk(root_src_dir):
        dst_dir = src_dir.replace(root_src_dir, root_dst_dir)
     
        if not os.path.exists(dst_dir):
            os.mkdir(dst_dir)
     
        for file_ in files:
            src_file = os.path.join(src_dir, file_)
            dst_file = os.path.join(dst_dir, file_)
     
            if os.path.exists(dst_file):
                os.remove(dst_file)
     
            shutil.copyfile(src_file, dst_file)
            print 'Le fichier %s à bien été copié !' %(file_)
    J'ai déjà inséré une barre de progression mais lors d'un transfert FTP via ce code et l'aide précieuse de ce forum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    # -*- coding: utf-8 -*-
     
    import os
    import ftplib
    import sys
    import time
     
    class FtpUploadTracker: 
        def __init__(self, totalSize):
            self.totalSize = totalSize
            self.sizeWritten = 0
            self.RefValue=0
            self.i=0
            self.p=0
            self.fin=''
            #print '[',
     
        def handle(self, block):
            self.sizeWritten += len(block)
            if self.sizeWritten < self.totalSize:
                if round((float(self.sizeWritten)/float(self.totalSize))*100) - self.RefValue==1:
                    i=self.i
                    if round((float(self.sizeWritten)/float(self.totalSize))*100)==100:
                        fin = "Upload terminé !"
     
                    self.p=int((float(self.sizeWritten)/float(self.totalSize))*100)
                    ligne = '[' + '#'*i + ' '*(20-i) + '] %d%% %s' % (self.p, self.fin) 
                    sys.stdout.write('\r%s' % ligne)
                    sys.stdout.flush()
                    self.i += 1
                    toto.write(str(i))
                    self.RefValue=self.RefValue+5
     
            else:
                sys.stdout.write('\r\n')
                sys.stdout.flush() 
     
     # Connect
    ftp = ftplib.FTP('hôte', 'login', 'pass')
     
    # file to send
    fichier = 'test.zip'
    print 'File Name: '+fichier
    totalSize = os.path.getsize(fichier)
    print 'Size of file: '+str(totalSize/(1024*1024))+'Mo'
    f = open(fichier, 'rb')
     
    """
    Class FtpUploadTracker
    """
    uploadTracker = FtpUploadTracker(totalSize)
     
    # Send the file
    ftp.storbinary('STOR ' + fichier, f, 1024, uploadTracker.handle)
     
    # Close file and FTP
    f.close()
    ftp.quit()
    Dans ce code lorsque j'envoyais mon fichier sur le FTP je faisais appel à ma classe FtpUploadTracker: ftp.storbinary('STOR ' + fichier, f, 1024, uploadTracker.handle). Je pouvais récupérer via block la valeur des données envoyées et donc savoir ou j'en étais dans mon upload.

    Je souhaite savoir s'il est possible de faire la même chose mais avec shutil.copyfile ?

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Salut,

    Citation Envoyé par nekcorp Voir le message
    Je souhaite savoir s'il est possible de faire la même chose mais avec shutil.copyfile ?
    Il y a deux choses à compter: le nombre de fichiers et le nombre d'octets à recopier.
    shutil.copyfile ne pourrait vous donnez que la progression sur le nombre d'octets puis qu'il travaille "par fichier".
    Mais, il ne le fait pas.

    Ceci dit, vous pourriez "améliorer" son code pour que appeler un callback tous les XXX bytes.
    Voir les sources du module shutil.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Il y a deux choses à compter: le nombre de fichiers et le nombre d'octets à recopier.
    shutil.copyfile ne pourrait vous donnez que la progression sur le nombre d'octets puis qu'il travaille "par fichier".
    Mais, il ne le fait pas.

    Ceci dit, vous pourriez "améliorer" son code pour que appeler un callback tous les XXX bytes.
    Voir les sources du module shutil.

    - W
    Si j'ai bien compris je ne pourrais effectuer un progression que sur le nombre de fichiers et non pas sur le nombre d'octets transmit par fichiers ?

    L'appel d'un callback est possible avec ftp.storbinary(). Peut être m'inspirer de ce qui a été fait avec ftplib ?

    Mais j'avouerai que je suis pas un expert, on va dire je suis un initié au langage python et j'aime vraiment ce code . Je vais avoir besoin de votre aide j'imagine

    encore merci

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Si j'ai bien compris je ne pourrais effectuer un progression que sur le nombre de fichiers et non pas sur le nombre d'octets transmit par fichiers ?
    Lorsqu'on programme on fait ce qu'on veut (ou ce qu'on peut).
    Par contre, avant de coder, il vous faut bien choisir quoi compter: la progression sur le nombre de fichiers et/ou progression sur le nombre de blocks (total) et/ou progression sur le ou les fichiers en cours de copie.

    Il n'est pas interdit d'avoir plusieurs barres de progression...

    C'est juste un peu plus de code à écrire.
    note: et c'est vous qui tenez le crayon.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Lorsqu'on programme on fait ce qu'on veut (ou ce qu'on peut).
    Par contre, avant de coder, il vous faut bien choisir quoi compter: la progression sur le nombre de fichiers et/ou progression sur le nombre de blocks (total) et/ou progression sur le ou les fichiers en cours de copie.
    - W
    Non mais ce que je voulais dire c'est que par défaut avec shutil.copyfile(), je ne peux pas récupérer les blocks afin de faire une progression sur le nombre d'octet copiés, il faut donc que je modifie le shutil.py pour pourvoir le faire ?

    Il n'est pas interdit d'avoir plusieurs barres de progression...
    Oui je peux très bien mettre une barre de progression sur le nombre de fichiers restant à copier et une qui me dit à combien de pour-cent j'en suis sur le fichier en cours de copie.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Non mais ce que je voulais dire c'est que par défaut avec shutil.copyfile(), je ne peux pas récupérer les blocks afin de faire une progression sur le nombre d'octet copiés, il faut donc que je modifie le shutil.py pour pourvoir le faire ?
    Je disais juste que vous pourriez vous en inspirez pour coder votre copyfile qui accepte un callback.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre très actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Lorsqu'on programme on fait ce qu'on veut (ou ce qu'on peut).
    Par contre, avant de coder, il vous faut bien choisir quoi compter: la progression sur le nombre de fichiers et/ou progression sur le nombre de blocks (total) et/ou progression sur le ou les fichiers en cours de copie.

    Il n'est pas interdit d'avoir plusieurs barres de progression...

    C'est juste un peu plus de code à écrire.
    note: et c'est vous qui tenez le crayon.

    - W
    Euh....@wiztricks , essayez aussi d'éviter les fautes grammaticales . Désolé , je n'ai pas pu m’empêcher de vous le dire , néanmoins , votre cerveau est assez bien développé

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/03/2013, 21h09
  2. Ajout d'une progress bar lors d'un rafraichissement
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 16/04/2008, 15h01
  3. Réponses: 3
    Dernier message: 29/10/2006, 23h35
  4. I/O Error lors de la copie d'un fichier
    Par Rodrigue dans le forum Windows XP
    Réponses: 7
    Dernier message: 04/08/2006, 10h35
  5. erreur 70 lors de la copie d'un fichier
    Par aarlock dans le forum Access
    Réponses: 2
    Dernier message: 15/05/2006, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo