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 :

Upload de fichier sur un serveur FTP mais à quelle vitesse ?


Sujet :

Python

  1. #1
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut Upload de fichier sur un serveur FTP mais à quelle vitesse ?
    Bonjour à tous.

    Voilà j'upload sur mon serveur des fichiers assez gros à l'aide de la librairie ftplib. Jusqu'ici aucun problème ça fonctionne parfaitement.

    Mais voilà j'aimerai améliorer mon code afin de connaitre le débit qui est utilisé pour uploader mes fichiers et pourquoi pas faire en sorte d'afficher en temps réel le temps qu'il me reste pour que le fichier soit totalement uploadé.

    Je ne sais pas si une fonction ou une classe existe pour faire ça, car dans la doc cela n'est pas indiqué : ftplib-FTP protocol client

    Merci d'avance pour votre aide.

  2. #2
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Je reviens avec un bout de code trouvé sur le net.

    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
     
    class FtpUploadTracker:
        sizeWritten = 0
        totalSize = 0
        lastShownPercent = 0
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
     
        def handle(self, block):
            self.sizeWritten += 1024
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
     
            if (self.lastShownPercent != percentComplete):
                self.lastShownPercent = percentComplete
                print(str(percentComplete) + " percent complete")
    J'ai essayé de l'intégrer à mon code mais j'ai une erreure qui me dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Applications/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
        execfile(filename, namespace)
      File "/Users/Developpement/Python/Upload_Progress/Upload_Progress.py", line 36, in <module>
        ftp.storbinary('STOR test.zip', file, 1024, uploadTracker.handle)
    NameError: name 'ftp' is not defined
    ci dessous le code qui donne l'erreur.

    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
     
    import ftplib
    totalSize = 0
     
    class FtpUploadTracker:
        sizeWritten = 0
        totalSize = 0
        lastShownPercent = 0
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
     
        def handle(self, block):
            self.sizeWritten += 1024
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
     
            if (self.lastShownPercent != percentComplete):
                self.lastShownPercent = percentComplete
                print(str(percentComplete) + " percent complete")
     
     
     # Connect
    s = ftplib.FTP('hôte','login','pass')
     
    # file to send
    f = open('test.zip','rb')                
    uploadTracker = FtpUploadTracker(int(totalSize))
     
    # Send the file
    ftp.storbinary('STOR test.zip', file, 1024, uploadTracker.handle) 
     
    # Close file and FTP
    f.close()
    s.quit()
    Je ne comprend pas pourtant j'importe bien la lib ftplib dés le départ.

    Une idée ?

    Merci d'avance pour vos réponses.

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Le "ftp" inconnu est le résultat de "ftplib.FTP('hôte','login','pass')". Il faut donc corriger la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ftp = ftplib.FTP('hôte','login','pass')
    Ainsi que la dernière ligne s.quit() => ftp.quit()

    Je n'ai pas regardé le code dans le détail, mais globalement, la méthode est bonne.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Le "ftp" inconnu est le résultat de "ftplib.FTP('hôte','login','pass')". Il faut donc corriger la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ftp = ftplib.FTP('hôte','login','pass')
    Ainsi que la dernière ligne s.quit() => ftp.quit()

    Je n'ai pas regardé le code dans le détail, mais globalement, la méthode est bonne.
    Je venais juste de le voir et effectivement j'avais trouvé l'erreur à ligne 30 :

    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
     
    import ftplib
    totalSize = 0
     
    class FtpUploadTracker:
        sizeWritten = 0
        totalSize = 0
        lastShownPercent = 0
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
     
        def handle(self, block):
            self.sizeWritten += 1024
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
     
            if (self.lastShownPercent != percentComplete):
                self.lastShownPercent = percentComplete
                print(str(percentComplete) + " percent complete")
     
     
     # Connect
    s = ftplib.FTP('hôte','login','pass')
     
    # file to send
    f = open('test.zip','rb')                
    uploadTracker = FtpUploadTracker(int(totalSize))
     
    # Send the file
    s.storbinary('STOR test.zip', file, 1024, uploadTracker.handle) 
     
    # Close file and FTP
    f.close()
    s.quit()
    Par contre cette fois ci j'ai un soucis car il me met ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Applications/anaconda/lib/python2.7/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile
        execfile(filename, namespace)
      File "/Users/mohamed/Developpement/Python/Upload_Progress/Upload_Progress.py", line 35, in <module>
        s.storbinary('STOR test.zip', f, 1024, uploadTracker.handle) 
      File "/Applications/anaconda/python.app/Contents/lib/python2.7/ftplib.py", line 476, in storbinary
        if callback: callback(buf)
      File "/Users/mohamed/Developpement/Python/Upload_Progress/Upload_Progress.py", line 21, in handle
        percentComplete = round((self.sizeWritten / self.totalSize) * 100)
    ZeroDivisionError: integer division or modulo by zero
    Je comprend qu'au départ la valeur de totalSize est également à zero mais ne devrait elle pas valoir la taille du fichier qui est entrain d'être uploadé ? Car à aucun moment je ne vois cette valeur intervenir.

    encore merci.

  5. #5
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Je me répond à moi même

    effectivement il faut à un moment définir la taille du fichier qui va être uploadé afin de savoir où en est l'upload.

    Donc du coup j'ai rajouté cette ligne afin de savoir la taille du fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    totalSize = os.path.getsize('test.zip')
    Le code devient donc :

    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
     
    import ftplib
     
    class FtpUploadTracker:
        sizeWritten = 0
        totalSize = os.path.getsize('test.zip')
        lastShownPercent = 0
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
     
        def handle(self, block):
            self.sizeWritten += 1024
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
     
            if (self.lastShownPercent != percentComplete):
                self.lastShownPercent = percentComplete
                print(str(percentComplete) + " percent complete")
     
     
     # Connect
    s = ftplib.FTP('hôte','login','pass')
     
    # file to send
    f = open('test.zip','rb')                
    uploadTracker = FtpUploadTracker(int(totalSize))
     
    # Send the file
    s.storbinary('STOR test.zip', file, 1024, uploadTracker.handle) 
     
    # Close file and FTP
    f.close()
    s.quit()
    Cependant j'ai toujours le même message d'erreur. J'ai ajouté un print à la ligne précédent la division par zéro comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def handle(self, block):
            self.sizeWritten += 1024
            print self.totalSize
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
    et effectivement ça me renvoie self.totalSize = 0.

    Une idée ?

    Encore merci

  6. #6
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Bon j'ai trouvé pourquoi ça ne fonctionnait pas

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    import ftplib
    import os
    totalSize = os.path.getsize('test.zip')
     
    class FtpUploadTracker:
        sizeWritten = 0
     
        print('Total file size : ' + str(round(totalSize / 1024 / 1024 ,1)) + ' Mb')
        lastShownPercent = 0
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
     
        def handle(self, block):
            self.sizeWritten += 1024
            percentComplete = round((self.sizeWritten / self.totalSize) * 100)
     
            if (self.lastShownPercent != percentComplete):
                self.lastShownPercent = percentComplete
                print(str(percentComplete) + " percent complete")
     
    # Connect
    s = ftplib.FTP('ftpperso.free.fr','mohamed.nekkache','UZBgto02')
     
    # file to send
    f = open('test.zip','rb')                
    uploadTracker = FtpUploadTracker(int(totalSize))
     
    # Send the file
    s.storbinary('STOR test.zip', f, 1024, uploadTracker.handle) 
     
    # Close file and FTP
    f.close()
    s.quit()
    il fallait initialiser la valeur de totelSize en dehors de la classe. Je ne mis connait pas trop en classe donc ...

    Cependant le résultat est loin d'être celui que je voulais obtenir.

    Durant l'upload je n'ai plus la main et je ne vois pas l'avancement en temps réel de mon upload (0%, 1%, 2% ...... 100%). Je récupère uniquement à la fin de l'upload le 100 percent complete.

    Dés que je récupère la main je comprend bien que l'upload est terminé

    Donc finalement ça répond pas à ma problématique de départ

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    J'ai corrigé un peu ton code, mais je ne l'ai pas essayé. Il devrait afficher le % d'avancement:

    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
    import os
    import ftplib
     
    class FtpUploadTracker:
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
            self.sizeWritten = 0
     
        def handle(self, block):
            self.sizeWritten += len(block)
            if self.sizeWritten < self.totalSize:
                percentComplete = round((self.sizeWritten / self.totalSize) * 100)
                print("progression= %f3.2" % percentComplete)
            else:
                print("upload terminé")
     
     # Connect
    ftp = ftplib.FTP('hôte', 'login', 'pass')
     
    # file to send
    fichier = 'test.zip'
    totalSize = os.path.getsize(fichier)
    f = open(fichier, 'rb')
    uploadTracker = FtpUploadTracker(totalSize)
     
    # Send the file
    ftp.storbinary('STOR ' + fichier, f, 1024, uploadTracker.handle)
     
    # Close file and FTP
    f.close()
    ftp.quit()
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    J'ai corrigé un peu ton code, mais je ne l'ai pas essayé. Il devrait afficher le % d'avancement:

    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
    import os
    import ftplib
     
    class FtpUploadTracker:
     
        def __init__(self, totalSize):
            self.totalSize = totalSize
            self.sizeWritten = 0
     
        def handle(self, block):
            self.sizeWritten += len(block)
            if self.sizeWritten < self.totalSize:
                percentComplete = round((self.sizeWritten / self.totalSize) * 100)
                print("progression= %f3.2" % percentComplete)
            else:
                print("upload terminé")
     
     # Connect
    ftp = ftplib.FTP('hôte', 'login', 'pass')
     
    # file to send
    fichier = 'test.zip'
    totalSize = os.path.getsize(fichier)
    f = open(fichier, 'rb')
    uploadTracker = FtpUploadTracker(totalSize)
     
    # Send the file
    ftp.storbinary('STOR ' + fichier, f, 1024, uploadTracker.handle)
     
    # Close file and FTP
    f.close()
    ftp.quit()
    Merci pour tes modifications c'est un peut plus clair en plus

    Mais voilà quand je le lance voilà ce qu'il me renvoie durant l'upload :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    progression= 0.0000003.2
    upload terminé
    Tu lui demande d'afficher quoi exactement avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("progression= %f3.2" % percentComplete)
    C'est le %f3.2 que je ne comprend pas.

    encore merci de ton aide.

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    C'est le %f3.2 que je ne comprend pas.
    Simple faute de frappe: c'est "%3.2f" C'est pour avoir un affichage comme 32.45
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Simple faute de frappe: c'est "%3.2f" C'est pour avoir un affichage comme 32.45
    J'ai effectivement fait la modification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print("progression= %3.2f" % percentComplete)
    mais j'obtient ça maintenant :

    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
     
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    progression= 0.00
    upload terminé

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Vous bossez avec Python2.
    sizeWritten est un entier plus grand que totalSize.
    Par défaut, sizeWritten / totalSize sera toujours inférieur à 1 et donc l'entier 0.
    Ajoutez "from __future__ import division" en en-tête ou transformez l'entier en float - float(sizeWritten) / totalSize - ou utilisez Python3.

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

  12. #12
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Vous bossez avec Python2.
    sizeWritten est un entier plus grand que totalSize.
    Par défaut, sizeWritten / totalSize sera toujours inférieur à 1 et donc l'entier 0.
    Ajoutez "from __future__ import division" en en-tête ou transformez l'entier en float - float(sizeWritten) / totalSize - ou utilisez Python3.

    - W
    Salut,

    Oui effectivement je bosse avec Python2.

    En utilisant le float sur sizeWritten ça résous le problème, mais niveau esthétique c'est pas super. Le fait qu'une même valeur se répète n fois ....

    Je vais essayé de me tourner vers un progress bar. J'en ai vue des pas mal mais je ne sais pas comment les intégrer

  13. #13
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Par contre j'ai une question. Qu'est ce que block dans la définition de la fonction handle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def handle(self, block):
    Et peut être que la réponse à ma deuxième question découlera de la réponse de la première , pourquoi dire que self.sizeWritten+=len(block) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.sizeWritten += len(block)
    merci d'avance pour votre aide

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par nekcorp Voir le message
    Qu'est ce que block dans la définition de la fonction handle ?
    C'est le block d'octets effectivement transmis. En principe, sa taille correspond à la quantité demandé dans le storbinary (ici 1024 octets), sauf pour le dernier block parce que la taille du fichier n'est pas forcément un nombre entier de fois 1024.

    Donc: si on additionne toutes les tailles des blocs transmis (len(block)), on retrouve la taille exacte en octets du fichier transmis (=100%).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  15. #15
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,



    C'est le block d'octets effectivement transmis. En principe, sa taille correspond à la quantité demandé dans le storbinary (ici 1024 octets), sauf pour le dernier block parce que la taille du fichier n'est pas forcément un nombre entier de fois 1024.

    Donc: si on additionne toutes les tailles des blocs transmis (len(block)), on retrouve la taille exacte en octets du fichier transmis (=100%).
    Ok merci, en faisait des print un peu partout c'est ce que j'avais cru comprendre.

    Donc du coup j'étais sur une petite amélioration de l'avancement de l'upload au niveau de l'affichage, car effectivement c'est pas super super dans l'état.

    Du coup j'ai pensé à essayer d'afficher uniquement l'avancement (la valeur en %) si celle ci a changé de l'ordre de 5% par exemple. Comme ça j'aurai au final que 20 ligne d'affichées.

    J'ai pondu ce code mais bizarrement la condition ligne 16 à 18 n'est jamais vérifié (enfin je pense), car il ne m'affiche jamais le print self.RefValue + 'Percent'. A la fin j'obtient bien le upload terminé.

    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
     
    import os
    import ftplib
     
    class FtpUploadTracker: 
        def __init__(self, totalSize):
            self.totalSize = totalSize
            self.sizeWritten = 0
            self.RefValue=0
     
        def handle(self, block):
            self.sizeWritten += len(block)
            toto.write(str(self.sizeWritten)+'\n')
            if self.sizeWritten < self.totalSize:
     
                if (round(float(self.sizeWritten)/self.totalSize))-self.RefValue == 5:
                    self.RefValue=float(self.sizeWritten)/self.totalSize
                    print self.RefValue + 'Percent'
     
                #percentComplete = round((float(self.sizeWritten) / self.totalSize) * 100)
                #print percentComplete
                #print("progression= %3.2f" % percentComplete)
            else:
                print("upload terminé")
     
     # Connect
    ftp = ftplib.FTP('ftpperso.free.fr', 'mohamed.nekkache', 'UZBgto02')
     
    # file to send
    fichier = 'test.zip'
    totalSize = os.path.getsize(fichier)
    print totalSize
    f = open(fichier, 'rb')
    uploadTracker = FtpUploadTracker(totalSize)
     
    toto=open('sizeWrittenOutput.out','w')
     
    # Send the file
    ftp.storbinary('STOR ' + fichier, f, 1024, uploadTracker.handle)
     
    # Close file and FTP
    f.close()
    ftp.quit()
    toto.close()
    Quelqu'un pour m'orienter?

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par nekcorp
    Donc du coup j'étais sur une petite amélioration de l'avancement de l'upload au niveau de l'affichage, car effectivement c'est pas super super dans l'état.

    Du coup j'ai pensé à essayer d'afficher uniquement l'avancement (la valeur en %) si celle ci a changé de l'ordre de 5% par exemple. Comme ça j'aurai au final que 20 ligne d'affichées.
    C'est ce que j'appellerai un "détail".
    L'intérêt est que çà peut se reformuler "en dehors" du download FTP: soit "count" la taille du fichier et x variant de 1 à count, si on veut afficher les pourcentages multiples de 5, çà peut s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> from __future__ import division
    >>> count = 100
    >>> for x in range(1, count+1):
    ...     w = x / count
    ...     if not w*100%5:
    ...        print ('***', w)
    ...
    Une fois que le calcul est au point on peut s'amuser à ré-intégrer le détail dans le code.
    Et pas besoin d'uploader un fichier pour tester çà ni d'essayer de faire tourner l'ensemble de votre code.

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

  17. #17
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    C'est ce que j'appellerai un "détail".
    L'intérêt est que çà peut se reformuler "en dehors" du download FTP: soit "count" la taille du fichier et x variant de 1 à count, si on veut afficher les pourcentages multiples de 5, çà peut s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> from __future__ import division
    >>> count = 100
    >>> for x in range(1, count+1):
    ...     w = x / count
    ...     if not w*100%5:
    ...        print ('***', w)
    ...
    Une fois que le calcul est au point on peut s'amuser à ré-intégrer le détail dans le code.
    Et pas besoin d'uploader un fichier pour tester çà ni d'essayer de faire tourner l'ensemble de votre code.

    - W
    Merci pour ta contribution, mais dans ton code x va varier de 1 jusque la taille de mon fichier par pas de 1, ce qui est totalement différent que le len(block) de tyrtamos.

    J'ai pas mal testé de mon coté et je suis arrivé à un résultat qui me convient, certainement perfectible c'est sur, mais qui fonctionne avec l'ensemble des tests que j'ai fais.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    import os
    import ftplib
     
    class FtpUploadTracker: 
        def __init__(self, totalSize):
            self.totalSize = totalSize
            self.sizeWritten = 0
            self.RefValue=0
            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:                
                    print str(int((float(self.sizeWritten)/float(self.totalSize))*100))+'%',
                    self.RefValue=self.RefValue+5
     
                #percentComplete = round((float(self.sizeWritten) / self.totalSize) * 100)
                #print percentComplete
                #print("progression= %3.2f" % percentComplete)
            else:
                print '100%] upload terminé.'
     
     # Connect
    ftp = ftplib.FTP('hôte', 'login', 'pass')
     
    # file to send
    fichier = 'test.zip'
    totalSize = os.path.getsize(fichier)
    print str(totalSize/(1024*1024))+'Mo'
    f = open(fichier, 'rb')
    uploadTracker = FtpUploadTracker(totalSize)
     
    toto=open('sizeWrittenOutput.out','w')
     
    # Send the file
    ftp.storbinary('STOR ' + fichier, f, 1024, uploadTracker.handle)
     
    # Close file and FTP
    f.close()
    ftp.quit()
    toto.close()
    au final j'obtient ce résultat dans la console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    runfile('/Users/Developpement/Python/Upload_Progress/Upload_Progress2.py', wdir=r'/Users/Developpement/Python/Upload_Progress')
    7Mo
    [ 0% 5% 10% 15% 20% 25% 30% 35% 40% 45% 50% 55% 60% 65% 70% 75% 80% 85% 90% 95% 100%] upload terminé.
    >>>
    ça m'affiche sur la même ligne l'état d'avancement de l'upload lorsque la valeur des données transférées a variée de 5%. Cela évite de se retrouver avec 100 valeurs.

    Ce que j'aimerai ajouter maintenant c'est voir en temps réel l'équivalent en ko/s. Etant donnée que je connais la taille de mon fichier et l'équivalent des données envoyées, en introduisant le temps via time je peux peut être simuler en temps réel le débit d'upload.

    Sur certaines videos ou l'on voit des "progresses bar" en action, on peut effectivement apercevoir qu'il est possible de rafraichir l'état d'une variable tout en l'affichant au même endroit, comme sur cette vidéo à 1min6sec :

    Savez vous comment y parvenir sur un exemple simple dans un premier temps ? Genre afficher les valeurs de 1 à 100.

    Encore merci

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Merci pour ta contribution, mais dans ton code x va varier de 1 jusque la taille de mon fichier par pas de 1, ce qui est totalement différent que le len(block) de tyrtamos.
    Un pourcentage s'obtient avec un nombre entre 0 et 1. Et on peut le fabriquer comme on veut, mais désolé, cela est peut être trop abstrait pour vous.

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

  19. #19
    Membre averti 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
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Un pourcentage s'obtient avec un nombre entre 0 et 1. Et on peut le fabriquer comme on veut, mais désolé, cela est peut être trop abstrait pour vous.

    - W
    Non cela ne m'est pas abstrait bien au contraire, mais je si je fait varier x de 1 à 10000 (si mon la taille de mon fichier fait 10000), je vais boucler autant de fois. Dans le cas du len(block), en faisant des print j'ai pu constater que le nombre d'itération allait être moins important. Avec ton exemple, j'aurai pu dire que x varie de 1 à count en faisant des pas de len(block) par exemple. Mais le temps que je revienne sur le post j'avais déjà pondu ce que j'ai posté tout à l'heure.

    Mais 1000 mercis pour ta contribution je préfère avoir un tas de solutions que pas du tout. Et puis ta méthode je la garde sous le coude car je n'avais pas encore vue cette façon de faire :

    et quelque chose me dit que je vais pas tarder à l'utiliser pour un problème que je rencontrais.

    encore merci .

  20. #20
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En console, pour obtenir une barre de progression, on peut, par exemple, fixer à 20 caractères '#' la barre totale, ce qui fait que chaque incrément du % de 5% affichera un '#' de plus. C'est ce qui se passera en Python 2 si le print précédent est terminé par une virgule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range(0, 20):
        print '#',
    # # # # # # # # # # # # # # # # # # # #
    Il y a un espace entre les '#' parce qu'avec Python 2, les éléments à afficher séparés par des virgules sont espacés par défaut par un espace.

    Mais s'il s'agit d'un python 2 récent (>=2.6), on peut afficher à la mode "Python 3" comme suit:

    A mettre au tout début de page de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from __future__ import print_function
    Puis à titre d'essai (note les parenthèses du print!):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range(0, 20):
        print('#', end='')
    ####################
    Mais on doit mettre tous les prints de la page avec des parenthèses!

    Ok?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Envoyer un fichier sur un serveur FTP par proxy
    Par Tierisa dans le forum Access
    Réponses: 4
    Dernier message: 13/12/2005, 16h39
  2. Envoi de fichier sur un serveur FTP
    Par pepe2006 dans le forum Access
    Réponses: 6
    Dernier message: 02/12/2005, 10h19
  3. Upload de fichier sur le serveur
    Par krfa1 dans le forum ASP
    Réponses: 9
    Dernier message: 29/11/2005, 13h50
  4. Réponses: 4
    Dernier message: 15/09/2005, 13h27
  5. [FTP] Test de l'existence d'un fichier sur un serveur ftp
    Par lapartdombre dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 01/08/2005, 14h13

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