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 :

reprendre une boucle for après une erreur?


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Par défaut reprendre une boucle for après une erreur?
    Bonjour,

    Je suis ultra-débutant en Python dont j'avais besoin pour écrire une petite fonction me permettant d'aller rechercher un grand nombre de followers sur twitter pour faire du data mining. Cette quête peut prendre du temps (2 à 3 heure) car twitter limite le nombre de données télécharger. La fonction devient alors ultra sensible au problème de connections. Serait-ce possible d'attendre 2 minutes et continuer la boucle en cas d'erreur? Ca dépasse largement m.on niveau de compétence...

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def idfollowerstemp (twitter):
        ids = []
        for page in tweepy.Cursor(api.followers_ids, screen_name=twitter).pages():
            ids.extend(page)
            except TweepError: #Cette ligne bug
                time.sleep(120)
     
               # Les lignes que j'aimerais trouver
     
            print len(ids)
            time.sleep(120)
        return(ids)
    Voici le message d'erreur...

    Traceback (most recent call last):
    File "saveid.py", line 41, in <module>
    fol=idfollowerstemp(argv)
    File "saveid.py", line 21, in idfollowerstemp
    for page in tweepy.Cursor(api.followers_ids, screen_name=twitter).pages():
    File "build\bdist.win-amd64\egg\tweepy\cursor.py", line 75, in next
    File "build\bdist.win-amd64\egg\tweepy\binder.py", line 243, in _call
    File "build\bdist.win-amd64\egg\tweepy\binder.py", line 189, in execute
    tweepy.error.TweepError: Failed to send request: ('Connection aborted.', error(10054, 'Une connexion existante a d\xfb \xeatre ferm\xe9e par l\x92h\xf4te distant'))
    Merci

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    except s'utilise dans un bloc try - except - [finally] mais pas tout seul.

    Tu peux faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def idfollowerstemp (twitter):
        ids = []
        for id in api.followers_ids:
            try:
                ids.extend(tweepy.Cursor(id, screen_name=twitter).pages())
            except:
                pass
    Ce follower là ne sera pas pris en compte alors.
    Le time.sleep() je ne sais pas à quoi il sert mais si tu y tiens, tu peux le mettre à la place de pass.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Si l'erreur se traduit par la clôture de la connexion côté twitter, impossible de continuer un peu plus tard: il faut recommencer depuis le début ou "reprendre" à l'endroit ou çà s'est arrêté.

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

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Par défaut
    Merci énormément à tout les 2,

    Citation Envoyé par VinsS Voir le message
    Salut,

    except s'utilise dans un bloc try - except - [finally] mais pas tout seul.

    Tu peux faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def idfollowerstemp (twitter):
        ids = []
        for id in api.followers_ids:
            try:
                ids.extend(tweepy.Cursor(id, screen_name=twitter).pages())
            except:
                pass
    Ce follower là ne sera pas pris en compte alors.
    Le time.sleep() je ne sais pas à quoi il sert mais si tu y tiens, tu peux le mettre à la place de pass.
    En fait, j'ai mis 2 time.sleep():

    - Le premier dans la boucle car twitter n'accepte pas que l'on télécharge une grande quantité de donner d'un seul coup et casse l'autorisation alloué, du coup, en répartissant la chose sur plusieurs heures, on y arrive
    - Le deuxième se trouve dans l'exception car sur plusieurs heures, il y a des probabilités que ma connexion flanche donc délais = réparation possible. Il y aurait-il alors un moyen de se retrouver à la même itération?

    Citation Envoyé par wiztricks Voir le message
    Salut,

    Si l'erreur se traduit par la clôture de la connexion côté twitter, impossible de continuer un peu plus tard: il faut recommencer depuis le début ou "reprendre" à l'endroit ou çà s'est arrêté.

    - W
    Et si l'erreur vient d'une clôture de connexion de mon PC, est-ce aussi irrécupérable?

    Milles excuses pour mon manque de clarté et encore merci... Je vais déjà essayer avec tout ça...

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LéonTheux Voir le message
    - Le deuxième se trouve dans l'exception car sur plusieurs heures, il y a des probabilités que ma connexion flanche donc délais = réparation possible. Il y aurait-il alors un moyen de se retrouver à la même itération?
    Bonjour

    Si tu veux réitérer le même élément dans certaines conditions, il te faut alors une seconde boucle à l'intérieur de la première...

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for id in api.followers_ids:
        while True:             # Boucle infinie
            try:
                ids.extend(tweepy.Cursor(id, screen_name=twitter).pages())   # Traitement de id
                break           # Comme il n'y a pas eu de problème on sort du while pour passer à un nouvel id
            except:
                time.sleep(10)   # Ici pb - On attend alors 10 sec de tempo
            # try 
            # Ici tu n'es pas sorti du while donc ça repartira sur le même "id"...
       # while
    # for

    Citation Envoyé par LéonTheux Voir le message
    Et si l'erreur vient d'une clôture de connexion de mon PC, est-ce aussi irrécupérable?
    Ben non mais te faut réinitialiser une nouvelle connexion. C'est facile si la création de connexion est faite dans une fonction dédiée. Dans ce cas te suffit de réappeler ta fonction...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par LéonTheux Voir le message
    - Le deuxième se trouve dans l'exception car sur plusieurs heures, il y a des probabilités que ma connexion flanche donc délais = réparation possible. Il y aurait-il alors un moyen de se retrouver à la même itération?
    Imaginez avoir a recopier un fichier de plusieurs Go. Si le transfert se plante, vous aimeriez pouvoir reprendre là ou çà c'est arrêté plutôt qu'au début. Cela suppose que le client puisse dire au serveur passe moi les blocks suivants à partir de....
    Twitter ayant une API ReST réalise un "curseur" qui permet cela: avec les données vous avez les identifiants du next (et du previous).
    La technique est décrite ici.

    Mais cela n'a rien à voir avec de simples boucles imbriquées ou pas.

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

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Par défaut
    Merci beaucoup pour toutes ces réponses,

    Ce soir, il faut que j'aille faire un reset de mon processeur biologique dans quelques lieux de perditions et je teste tout ça dès que ses circuits sont rebranchés...

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/06/2008, 21h55
  2. Réponses: 6
    Dernier message: 26/11/2007, 15h25
  3. [SQL] Boucle SQL dans une boucle for
    Par architecte dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/08/2007, 11h47
  4. Réponses: 2
    Dernier message: 08/03/2007, 11h06
  5. utiliser une valeur float pour une boucle for
    Par didi59650 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/04/2006, 17h32

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