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. #21
    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,

    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?
    Merci tyrtamos c'est très clair, mais une question vient de me passer dans la tête.

    Dans mon code tu vois que je bidouille un peu pour le 100% à la fin (je le met en dur ) car effectivement je me suis rendu compte qu'il n'était pas afficher à la fin de l'upload. Donc au vu des exemples que j'ai pu voir dans la video, je me suis demandé comment faire pour dés le départ afficher une barre de progression fixe comme ceci :

    pour ensuite venir remplir via un print 'MonPourcentageDuploadAccompli', entre les crochets, la valeur du pourcentage d'upload accompli comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [0% 5% 10% 15%                                                                                                                           ]100%
    et une fois qu'il a terminé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [0% 5% 10% 15% 20% 25% 30% 35% 40% 45% 50% 55% 60% 65% 70% 75% 80% 85% 90% 95%] 100% Upload terminé !

    Pour moi la difficulté est de pouvoir écrire entre les crochets, je ne vois pas très bien comment faire

    Merci

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

    Un petit truc comme çà peut être?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import sys
    import time
     
    PERCENTS = [  _ * 5 for _ in range(20) ]
     
    def display(x):
        blanks = ' ' * len(' '.join(str(_) for _ in PERCENTS[x:]))
        line =  '[' + ' '.join(str(z) for z in PERCENTS[:x]) + blanks + ']'
        sys.stdout.write('\r%s' % line)
        sys.stdout.flush()
     
    for z in PERCENTS:
        display(z)
        time.sleep(0.1)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #23
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Effectivement, wiztricks a raison: le recours à sys.stdout.write au lieu de print permet de ne pas aller jusqu'au print de Python 3.

    Et dans ce cas, le caractère '\r' (=retour chariot) permet de revenir en début de ligne sans passer à la ligne suivante, ce qui permet de réécrire la ligne complète à chaque fois.

    Je suggère une contre-proposition:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 2.7
     
    import sys
    import time
     
    fin = ""
    i = 0 # compteur du nombre de '#'
    for p in range(0, 101, 5): 
        if int(p)==100:
            fin = "Upload terminé !"
        ligne = '[' + '#'*i + ' '*(20-i) + '] %d%% %s' % (p, fin) 
        sys.stdout.write('\r%s' % ligne)
        sys.stdout.flush()
        i += 1
        time.sleep(0.5) # pour la mise au point
    sys.stdout.write('\r\n')
    sys.stdout.flush()
    Ce qui affichera sans passage à la ligne suivante sur la console:

    la ligne pour p==0% (en fait p<5%):

    puis pour les lignes de la progression (exemple pour 45%):

    puis la ligne finale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [####################] 100% Upload terminé !
    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. #24
    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,

    Un petit truc comme çà peut être?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import sys
    import time
     
    PERCENTS = [  _ * 5 for _ in range(20) ]
     
    def display(x):
        blanks = ' ' * len(' '.join(str(_) for _ in PERCENTS[x:]))
        line =  '[' + ' '.join(str(z) for z in PERCENTS[:x]) + blanks + ']'
        sys.stdout.write('\r%s' % line)
        sys.stdout.flush()
     
    for z in PERCENTS:
        display(z)
        time.sleep(0.1)
    - W
    Presque sauf que tu met à jour l'état d'avancement dans sur une nouvelle ligne. ça je sais faire, mais pas comme tu as fait.

    Moi je veux une progression dans la même barre. Une seule et unique barre dans laquelle la progression évolue.

    Je sais pas si je me suis bien fait comprendre

    En tout cas en exploitant vos code j'apprend pas mal de choses.

    Merci

  5. #25
    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,

    Effectivement, wiztricks a raison: le recours à sys.stdout.write au lieu de print permet de ne pas aller jusqu'au print de Python 3.

    Et dans ce cas, le caractère '\r' (=retour chariot) permet de revenir en début de ligne sans passer à la ligne suivante, ce qui permet de réécrire la ligne complète à chaque fois.

    Je suggère une contre-proposition:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # Python 2.7
     
    import sys
    import time
     
    fin = ""
    i = 0 # compteur du nombre de '#'
    for p in range(0, 101, 5): 
        if int(p)==100:
            fin = "Upload terminé !"
        ligne = '[' + '#'*i + ' '*(20-i) + '] %d%% %s' % (p, fin) 
        sys.stdout.write('\r%s' % ligne)
        sys.stdout.flush()
        i += 1
        time.sleep(0.5) # pour la mise au point
    sys.stdout.write('\r\n')
    sys.stdout.flush()
    Ce qui affichera sans passage à la ligne suivante sur la console:

    la ligne pour p==0% (en fait p<5%):

    puis pour les lignes de la progression (exemple pour 45%):

    puis la ligne finale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [####################] 100% Upload terminé !
    Beaucoup mieux effectivement, mais même remarque qu'au dessus. En fait je veux un affichage unique de la barre dans laquelle on aperçois la progression de l'agencement de l'upload.

    Un peut comme les exemples dans la video que j'ai mise page précédente.

    Merci en tout cas, ça avance pas mal j'espère y arriver aujourd'hui

  6. #26
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Beaucoup mieux effectivement, mais même remarque qu'au dessus. En fait je veux un affichage unique de la barre dans laquelle on aperçois la progression de l'agencement de l'upload.
    Bizarre, c'est ce que ça fait chez moi: progression sans changement de ligne!

    Je l'ai testé dans la console cmd.exe de Windows. Pour que ça marche, lance le programme dans une console, et pas dans un outil de développement (par exemple: ça change de ligne dans pydev de Eclipse).
    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

  7. #27
    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
    Bizarre, c'est ce que ça fait chez moi: progression sans changement de ligne!

    Je l'ai testé dans la console cmd.exe de Windows. Pour que ça marche, lance le programme dans une console, et pas dans un outil de développement (par exemple: ça change de ligne dans pydev de Eclipse).
    ok je suis sous Spyder (Mac Os). Je vais tester ça dans le terminal et je reviens vers vous.

    Merci

  8. #28
    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 nekcorp Voir le message
    ok je suis sous Spyder (Mac Os). Je vais tester ça dans le terminal et je reviens vers vous.

    Merci
    Oui effectivement depuis le terminal ça fait bien ce que j'attendais .

    Par contre peux tu m'expliquer cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne = '[' + '#'*i + ' '*(20-i) + '] %d%% %s' % (p, fin)
    je comprend jusqu'au '], tu assemble des chaines , mais après %d%% %s' % (p, fin) je ne connaissais pas cette écriture.

    Merci d'avance

  9. #29
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    je comprend jusqu'au '], tu assemble des chaines , mais après %d%% %s' % (p, fin) je ne connaissais pas cette écriture
    C'est du formatage de chaine: https://docs.python.org/2/library/st...ing-formatting

    "%d", c'est pour formater un nombre entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print "pourcentage: %d" % 45
    pourcentage: 45
    Si on veut ajouter un '%', on est obligé d'en mettre 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print "pourcentage: %d %%" % 45
    pourcentage: 45 %
    On peut aussi formateur une chaine de caractères: c'est %s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    chaine = "Upload"
    print "pourcentage: %d %% %s" % (45, chaine)
    pourcentage: 45 % Upload
    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. #30
    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
    C'est du formatage de chaine: https://docs.python.org/2/library/st...ing-formatting

    "%d", c'est pour formater un nombre entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print "pourcentage: %d" % 45
    pourcentage: 45
    Si on veut ajouter un '%', on est obligé d'en mettre 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print "pourcentage: %d %%" % 45
    pourcentage: 45 %
    On peut aussi formateur une chaine de caractères: c'est %s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    chaine = "Upload"
    print "pourcentage: %d %% %s" % (45, chaine)
    pourcentage: 45 % Upload
    Ok en fait c'est pour pouvoir faire des associations de chaines de caractères entre des string et des integer. Moi je m'amusais tout le temps à mettre des str pour pouvoir le faire.

    Merci je vais regarder ça de plus prêt.

  11. #31
    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 je viens de tester mon code à travers ma console. Car je développe souvent sous l'environnement Spyder (pour débouquer c plus rapide et facile) et ensuite quand je déploie mes code je passe sous console.

    Donc j'ai testé mon code (celui qui fonctionnait parfaitement) et surprise ma barre de progression ne s'affiche plus

    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
     
    # -*- coding: utf-8 -*-
     
    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
            else:
                print '100%] upload terminé.'
     
     # 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')
    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()
    Donc durant l'upload rien ne s'affiche et à la fin toute la barre s'affiche d'un coup comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     0% 5% 10% 15% 20% 25% 30% 35% 40% 45% 50% 55% 60% 65% 70% 75% 80% 85% 90% 95% 100%] upload terminé.
    Il y a une différence lorsque l'on bosse en mode console et sous environnement type Spyder (Mac OS) ou IDLE sous windows ?

    D'après ce que je vois je répond tout seul OUI , mais comment savoir les différences notable entre le mode console et le mode environnement de développement ?
    Et d'ou vient le problème dans ce cas ?

    Merci d'avance pour ses éclaircissements.

    EDIT : Bon j'ai testé un truc en mode console :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for i in range (0,105,5):
    	print i,
    Donc la pas de soucis, le résultat souhaité est le bon.

    Mais dès que j'ajoute un time.sleep(0.5) et bien j'ai le même beug d'affichage d'écrit plus haut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    import time
     
    for i in range (0,105,5):
            time.sleep(0.5)
    	print i,
    Bon dans mon code original je n'ai pas de time.sleep effectivement, mais bon on dirait que le problème vient d'un rafraichissement qui ne se fait pas en mode console.

    Je rame là

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

    Je n'ai pas OSX sous la main, mais que se passe-t-il avec les instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import time, sys
     
    for i in range (0,105,5):
            time.sleep(0.5)
    	sys.stdout.write(str(i))
            sys.stdout.flush()
    - W
    PS: Une console affiche sur un terminal et comme sur un terminal on affiche des lignes (se terminant par CRLF) une optimisation parfois utilisée est de "bufferiser" (i.e. ne pas afficher) avant que le CRLF ait été reçu. Si on veut changer çà, il faut pouvoir dire "affiche quand même", c'est le rôle du "flush". Mais c'est une théorie qui se teste avec le petit bout de code précédent.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #33
    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,

    Je n'ai pas OSX sous la main, mais que se passe-t-il avec les instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import time, sys
     
    for i in range (0,105,5):
            time.sleep(0.5)
    	sys.stdout.write(str(i))
            sys.stdout.flush()
    - W
    PS: Une console affiche sur un terminal et comme sur un terminal on affiche des lignes (se terminant par CRLF) une optimisation parfois utilisée est de "bufferiser" (i.e. ne pas afficher) avant que le CRLF ait été reçu. Si on veut changer çà, il faut pouvoir dire "affiche quand même", c'est le rôle du "flush". Mais c'est une théorie qui se teste avec le petit bout de code précédent.

    effectivement dans ce cas ça fonctionne

    voila ce que renvoie le terminal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    05101520253035404550556065707580859095100
    il affiche successivement 0510 etc .....

    Donc ça marche.

    Alors pour en revenir à mon code je dois modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print str(int((float(self.sizeWritten)/float(self.totalSize))*100))+'%',
    en utilisant sys.stdout.write() et sys.stdout.flush() ?

  14. #34
    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
    j'ai effectivement modifié mon code en remplaçant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print str(int((float(self.sizeWritten)/float(self.totalSize))*100))+'%',
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sys.stdout.write(str(int((float(self.sizeWritten)/float(self.totalSize))*100))+'%'+' '),
    sys.stdout.flush()
    par contre petite subtilité, il faut ajouter l'espace à la fin d'où le +' ', sinon les caractères ne sont pas séparés.

    Vraiment merci pour ton aide wiztricks.

  15. #35
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    par contre petite subtilité, il faut ajouter l'espace à la fin d'où le +' ', sinon les caractères ne sont pas séparés.
    Ce n'est pas une subtilité, "print" fait une cuisine pour vous simplifier la vie que sys.stdout.write ne fait pas.
    Mais vous pourriez avoir le meilleur des 2 en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> for x in range(10):
    ...     print >>sys.stdout, '\r%d' % x,  # >>sys.stdout est là pour la clarté ;-)
    ...     sys.stdout.flush()
    ...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  16. #36
    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
    Ce n'est pas une subtilité, "print" fait une cuisine pour vous simplifier la vie que sys.stdout.write ne fait pas.
    Mais vous pourriez avoir le meilleur des 2 en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> for x in range(10):
    ...     print >>sys.stdout, '\r%d' % x,  # >>sys.stdout est là pour la clarté ;-)
    ...     sys.stdout.flush()
    ...
    - W
    Désolé j'ai pas trop compris le principe du :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print >>sys.stdout, '\r%d' % x,

  17. #37
    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
    Voila le code fonctionnel

    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()
    Je vais continuer à le perfectionner car il est loin d'être parfait.

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