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 :

Imbrication de boucles


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut Imbrication de boucles
    Bonjour,
    je ne comprends pas pourquoi la 2 ème boucle ne s'exécute qu'une fois (celle ventes). Une fois le premier passage effectué, ligneA reste bloqué sur la dernière valeure prise dans ventes. Du coup, la boucle ne se relance pas pour la deuxième valeur de ligne. Comment faire un "RAZ" pour le pointeur de lecture du fichier ventes ?

    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
    #! /usr/bin/env python
    #-*- coding: iso-8859-15 -*-
     
    import csv
    #print csv.__doc__ 
    #print dir(csv)
    articles = csv.reader(open("TRAV288906-traitement4.CSV","rb"),delimiter=';')
    ventes = csv.reader(open("TRAV4_D00_003.CSV","rb"),delimiter=';')
    newarticles = csv.writer(open("trav2w.csv","wb"),delimiter=';')
    for ligne in articles:
        if ligne:
            numart = int(ligne[0])
        for ligneA in ventes:
            if ligneA:
                numart_vt = int(ligneA[0])
            if numart == numart_vt:
                print "Oky"                             
    newarticles.close()
    ventes.close()
    articles.close()
    François

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir vega95,

    Cela ne viens pas de ta boucle (si tu donne tout le code).

    Pourquoi ne pas déplacer ton ventes = csv.reader(open("TRAV4_D00_003.CSV","rb"),delimiter=';') / ventes.close() dans for ligne in articles: pour tester ?

    @+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut trop gros le fichier
    J'y avais songé mais le pb c'est que le fichier ventes en question fait 1,2 Go. Je ne peux pas l'ouvrir et fermer n fois sous peine d'y passer un certain temps

    François

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut suite
    j'ai aussi essayé un ventes.seek(0) mais il me répond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: '_csv.reader' object has no attribute 'seek'

    François

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne connais pas le module cvs, mais voilà 2 idées à tenter:

    1- ouvre le fichier ventes séparément:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fv = open("TRAV4_D00_003.CSV","rb")
    ventes = csv.reader(fv,delimiter=';')
    et applique fv.seek(0) juste avant le début de boucle "for ligneA in ventes". Cela ne marchera que si en fin de boucle les fonctions cvs.Reader ne ferme pas le fichier fv par un fv.close().

    2- regarde dans la notice du module cvs du côté de DictReader. Ça a l'air de transformer le fichier en dictionnaire. Mais je ne sais pas s'il s'agit de le mettre en mémoire ou d'en normaliser l'accès comme un dictionnaire.

    Tyrtamos

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Par défaut
    Salut,

    une autre piste : si tu ne travailles que sur les premières colonnes de chacun des fichiers csv, tu peux récupérer tes infos sous forme de liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    articles = [int(ligne[0]) for ligne in csv.reader(open("TRAV288906traitement4.CSV","rb"),delimiter=';') if ligne]
     
    ventes = [int(ligne[0]) for ligne in csv.reader(open("TRAV4_D00_003.CSV","rb"),delimiter=';') if ligne]
    Je présume que tes fichiers, bien qu'ayant une taille monstrueuse, comportent assez peu de lignes et que la majorité de leur taille mémoire est justifiée par des infos annexes à ton problème.

    Je présume aussi que tu ne voudras jamais récupérer d'autres colonnes (genre : nom des articles, quantités vendues, prix, etc.), même si cela peut se modifier assez vite.
    Après, si tu as à terme dee récupérer l'intégralité de tes fichiers, laisse tomber mon approche.

    Le fseek de Tyrtamos est très bien.

    Et le DictReader permet de lire chaque ligne en tant que dictionnaire, dont les index sont les titres des colonnes et les valeurs sont les valeurs des colonnes de la ligne.
    C'est un itérateur, et il va chercher tout seul les titres des colonnes.
    C'est intéressant, mais pas si on ne cherche qu'à récupérer la première colonne des fichiers.
    Mais je penserais à m'en servir, merci Tyrtamos.

    Dernier point : le module csv ne supporte pas l'encodage : cette info t'intéressera si tu veux récupérer des strings non-ASCII. => n'utilise pas csv pour cela !

    Bon courage !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 62
    Par défaut super
    Merci pour vos réponses et idées. L'idée de Tyrtamos marche nickel

    Résolu donc

    merci,
    François

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Imbrication de boucles
    Par Vinuto dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 05/06/2012, 11h17
  2. Imbrication de boucles For
    Par dominos dans le forum Débuter
    Réponses: 4
    Dernier message: 03/04/2010, 17h53
  3. [MySQL] Imbrication de boucle if /else et while
    Par jmtrivia dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/04/2009, 12h11
  4. imbrication de boucle (exemple :d'upload)
    Par new-dmx dans le forum Langage
    Réponses: 2
    Dernier message: 01/09/2008, 15h18
  5. Encore problème d'imbrication de boucles
    Par flora806 dans le forum Langage
    Réponses: 4
    Dernier message: 21/02/2008, 15h25

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