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 :

Boucle infini / erreur d’écriture. [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de Atomicfryer
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2004
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2004
    Messages : 103
    Par défaut Boucle infini / erreur d’écriture.
    Bonjour à tous

    Je suis entrain de découvrir python dans le cadre de mon travail... C'est surtout le seul langage exécutable sur ma machine... alors c'est l’occasion d'apprendre.

    Je cherche a faire une moulinette qui va permettre de découper un fichier en plusieurs sous fichier en fonction d'une valeur en début de chaque ligne.

    Actuellement, je suis bloqué sur la fin du traitement... En effet le découpage se passe pas trop mal... Sauf pour le dernier fichier.
    La boucle semble bloqué ! Le fichier est crée mais vite !!
    Ne connaissant pas encore suffisamment les outils de debug... je m'en réfère à vous

    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
    file = "LLOC_TEST.txt"
    insee = ""
    current = ""
     
    print("----| lecture du fichier : " + file + " |----")
    f = open(file, "r")
     
    while 1 :
        data = f.readline()
        if not data :
            break
        insee = data[0:6]
     
        # Création du fichier avec ecriture des lignes
        if current != insee :
            print("--> création du fichier : " + insee + ".txt")
            foutput = open(insee+".txt", "a")
            current = insee
     
        print("> écriture de la ligne : " + data.rstrip())
        foutput.write(data)
    Exmple de fichier a découper :
    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
    950074          BOISEMONT   
    950074    B0771001000010210950074   074064530000002030001000
    950074    B0771001000010310950074   074064418800002430001000
    950074    B0771001000020110950074   074064530100000230001000
    950074    B0771001000020210950074   074064419100000240001000
    950074    B0771001000030110950074   074064418800000160001000
    950074    B0771001000030210950074   074064530100000100001000
    950074    B0771001000030310950074   074064530100000100001000
    950074    B0771001000030410950074   074064605600000100001000
    950074    B0771001000030510950074   074064605600000100001000
    950127          CERGY                                       
    950127   AE0249001000000110950127   127053175600003540001000
    950127   AE0249001000000210950127   127053175700003090001000
    950127   AE0249001000000310950127   127053175800003010001000
    950127   AE0249001000000410950127   127053175800000360001000
    950127   AH0038001000000110950127   127055996700003000001000
    950127   AH0038001000000210950127   127056884700002800001000
    950127   AH0038001000000210950127   127056884800002800001000
    950388          MENUCOURT                                   
    950388    A0082001000000110950388   388054469400000850001000
    950388    A0082001000000210950388   388056272100009150001000
    950388   AB0018001000000110950388   388026830600000750010000
    950388   AB0018001000000210950388   388026830800000750010000
    950637          VAUREAL                                     
    950637   AB0021001000000110950637   637004568700000750003000
    950637   AB0021001000000210950637   637004568500001920003000
    950637   AB0021001000000310950637   637004568600004830003000
    950637   AB0021001000000410950637   637004568900000690003000
    950637   AB0021001000000510950637   637004568800003540003000
    950637   AB0021001000000610950637   637004569000000780003000
    950637   AB0021001000000710950637   637004569100003930003000
    950637   AB0021001000000810950637   637004569200000300003000
    950637   AB0021001000000910950637   637004568500000030003000
    950637   AB0021001000001010950637   637004569100000090003000
    950637   AB0021001000001110950637   637004568800000120003000
    950637   AB0021001000001210950637   637004568600000180003000
    950637   AB0021001000001610950637   637004569300000360003000
    950637   AB0021001000001710950637   637004569400000450003000
    950637   AB0021001000001810950637   637004569500000450003000
    950637   AB0021001000001910950637   637004569600000450003000
    Certains d'entre vous devrait bien avoir une petite idée... mais moi je cherche et je séche !

  2. #2
    Membre éclairé
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Amateur
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 52
    Par défaut
    Salut,

    Je ne comprends pas le problème que tu observes. J'ai essayé ton code avec les données fournies et j'obtiens bien 4 fichiers textes remplis.

    Sinon pense à fermer tes fichiers ! Tu fais open() mais pas close(). Tant qu'à apprendre quelque chose, c'est le moment de regarder les context managers. Il y a une courte introduction dans le tutoriel https://docs.python.org/3.5/tutorial...f-file-objects

  3. #3
    Membre confirmé
    Avatar de Atomicfryer
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2004
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2004
    Messages : 103
    Par défaut
    Et bien j'ai bien 4 fichiers crées... mais le 4eme est vide... Comme si la partie write etait bloqué... D''ailleurs, le fichier est verouillé... je ne peux pas le supprimé ! Je suis obliqué de quitter le shell pour pouvoir supprimer le fichier.

    Le script n'arrive pas au bout du processus.

    Et comme je débute en python, je suis un peu déconcerté par l'indentation du code...

  4. #4
    Membre confirmé
    Avatar de Atomicfryer
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2004
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2004
    Messages : 103
    Par défaut
    Citation Envoyé par Dan737 Voir le message
    Tant qu'à apprendre quelque chose, c'est le moment de regarder les context managers. Il y a une courte introduction dans le tutoriel https://docs.python.org/3.5/tutorial...f-file-objects
    Le pire c'est que je l'ai lu

  5. #5
    Membre éclairé
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Amateur
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 52
    Par défaut
    J'ai voulu faire un exemple sans utiliser iterools.groupby, mais ce n'est pas trivial. Il y a peut-être plus joli, mais je te propose ceci:

    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
    file = "LLOC_TEST.txt"
     
    print("----| lecture du fichier : " + file + " |----")
    with open(file, "r") as f:
        data = f.read().splitlines()
     
    if not data:
        raise ValueError("The file is empty !")
     
    it = iter(data)   
    line = next(it)
    insee = line[0:6]
     
    more_data = True
    while more_data:
        current = insee
        print("--> création du fichier : " + insee + ".txt")
        with open(insee+".txt", "w") as foutput:
            while insee == current:
                print("> écriture de la ligne : " + line)
                foutput.write(line + "\n")
                try:
                    line = next(it)
                except StopIteration:
                    more_data = False
                    break
                insee = line[0:6]
    Sinon aver groupby c'est beaucoup plus concis et lisible je trouve

    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
    from itertools import groupby
     
    file = "LLOC_TEST.txt"
     
    print("----| lecture du fichier : " + file + " |----")
    with open(file, "r") as f:
        data = f.read().splitlines()
     
    if not data:
        raise ValueError("The file is empty !")
     
    for key, group in groupby(data, key=lambda e: e[:6]):
        print("--> création du fichier : " + key + ".txt")
        with open(key + ".txt", "w") as foutput:
            for line in group:
                print("> écriture de la ligne : " + line)
                foutput.write(line + "\n")

  6. #6
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 485
    Par défaut
    Oui, c'est un souci de "close" manquant.
    En faite, en ré-ouvrant un nouveau fichier, le précédent est alors fermé (et donc flushé) à ce moment là.
    Mais comme le dernier n'est jamais fermé, il reste non flushé.
    A noter que ce comportement peut-être différent sous Windows que sous Linux/Unix.

    Essaye avec ceci, cela doit marché:
    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
    file = "LLOC_TEST.txt"
    insee = ""
    current = ""
    foutput = None
     
    print("----| lecture du fichier : " + file + " |----")
    f = open(file, "r")
     
    while 1 :
        data = f.readline()
        if not data :
            break
        insee = data[0:6]
     
        # Création du fichier avec ecriture des lignes
        if current != insee :
            if foutput!=None:
                foutput.close()
            print("--> création du fichier : " + insee + ".txt")
            foutput = open(insee+".txt", "a")
            current = insee
     
        print("> écriture de la ligne : " + data.rstrip())
        foutput.write(data)
    if foutput!=None:
        foutput.close()

  7. #7
    Membre confirmé
    Avatar de Atomicfryer
    Homme Profil pro
    Géomaticien
    Inscrit en
    Février 2004
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Géomaticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2004
    Messages : 103
    Par défaut
    Citation Envoyé par Laurent 1973 Voir le message
    Oui, c'est un souci de "close" manquant....
    Merci Laurent, c'est bien ça... j'avais lu la doc sur le Flush... mais comme je l'ai dit a l'instant, je suis perturbé par l'indentation et l’imbrication (qui n'est pas intuitive pour moi).
    Et je me doutais bien que : Ouvrir sans fermer... c'est crado

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

Discussions similaires

  1. Erreur inconnue : boucle infinie?
    Par dubitoph dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/10/2009, 09h05
  2. [Sécurité] boucle infinie je trouve pas l'erreur
    Par scorpking dans le forum Langage
    Réponses: 14
    Dernier message: 26/07/2006, 15h04
  3. Réponses: 15
    Dernier message: 24/05/2005, 08h34
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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