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 :

Programme simple qui s'emballe de façon inexpliqué


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Programme simple qui s'emballe de façon inexpliqué
    Bonjour à tous,

    tout d'abord,je débute en programmation.
    Je suis sous Mint 17.1 , IDE Eclipse 4.4 , Python 3.4

    Je cherche à concaténer 4 fichier csv de cette façon :

    fichier1-1 fichier2-1
    fichier1-2 fichier2-2

    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
    #!/usr/bin/python
     
    flag4 = 0
    fichierfinal = open('essais.txt', 'w')
    for i in range (1,3):
        nomdefichier1 = "2013-04-02_JeteeEst"+str(i)+".csv"
        nomdefichier2 = "2013-04-02_JeteeNord"+str(i)+".csv"
        fichiersource1 = open(nomdefichier1,'r')
        fichiersource2 = open(nomdefichier2,'r')
        while flag4 < 2:
            txt = fichiersource1.read(1)
            if txt == chr(10): #si retour chariot
                txt = ";;"
                fichierfinal.write(txt)
                while 1:
                    txt = fichiersource2.read(1)
                    if txt == "":
                        flag4 = flag4 + 1
                        break
                    if txt == chr(10):
                        fichierfinal.write(txt)
                        break
                    else :
                        fichierfinal.write(txt)
            else :
                fichierfinal.write(txt)
    fichiersource1.close()
    fichiersource2.close()
    fichierfinal.close()
    conca.zip

    Le fichier1-1 faite 737 lignes, le programme concatène comme je le veux mais s'emballe en arrêtant en milieu de ligne 707, le processus python prend 100% d'un CPU et se met à bouffer de la mémoire.
    A l'endroit où il s'arrête, il n'y rien de particulier, pas de caractère spéciale, ce n'est que du chiffre ou point-virgule...

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

    Pour résumer, ce while là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        while flag4 < 2:
            txt = fichiersource1.read(1)
            if txt == chr(10): #si retour chariot
               ...
            else :
                fichierfinal.write(txt)
    ne sort jamais car f.read(1) retourne la chaine vide lorsqu'on arrive à la fin du fichier mais cette condition n'est jamais testée.

    Dans tous les cas, inutile d'ouvrir un fichier texte pour le lire caractère par caractère: un fichier texte étant un ensemble de lignes séparées par une fin de ligne. Python permet de lire toutes les lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lines = fichiersource1.read().splitlines()
    ou ligne par ligne...


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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Merci pour ta réponse,
    Citation Envoyé par wiztricks Voir le message
    Pour résumer, ce while là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        while flag4 < 2:
            txt = fichiersource1.read(1)
            if txt == chr(10): #si retour chariot
               ...
            else :
                fichierfinal.write(txt)
    ne sort jamais car f.read(1) retourne la chaine vide lorsqu'on arrive à la fin du fichier mais cette condition n'est jamais testée.
    Dans ce cas là, je rencontrerais le problème qui me préoccupe en fin de fichier1, or il n'arrive pas jusqu'à la fin (707éme ligne sur les 737 du fichier).

    Citation Envoyé par wiztricks Voir le message
    Dans tous les cas, inutile d'ouvrir un fichier texte pour le lire caractère par caractère: un fichier texte étant un ensemble de lignes séparées par une fin de ligne, on lit toutes les lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lines = fichiersource1.read().splitlines()
    Je vais regardé cela, merci.
    C'est un peu bourrin ce que j'ai fait, mais je voulais introduire "; ;" entre les 2 lignes concaténées.

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

    Citation Envoyé par trapp Voir le message
    C'est un peu bourrin ce que j'ai fait, mais je voulais introduire "; ;" entre les 2 lignes concaténées.
    Soient L1 et L2 représentant les lignes des fichiers 1&2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> L1 = list('abcde')
    >>> L2 = list('12345')
    Si on veut "intercaler" ';;' entre chaque ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> for z in zip(L1, L2):
    ...     print(';;'.join(z))
    ...
    a;;1
    b;;2
    c;;3
    d;;4
    e;;5
    >>>
    Et vous voyez qu'on traite des listes de chaînes de caractères qui peuvent accessoirement avoir été remplies avec le contenu d'un fichier.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Amateur
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Points : 10
    Points
    10
    Par défaut
    Je n'arrive pas me servir de ce que tu me montres (surtout le splitlines malgré des recherches sur le sujet)
    Mais cela m'a fait réfléchir surtout ta remarque sur le traitement par ligne.
    Je pense avoir trouver une formule qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txt = fichiersource1.readline()[0:-1]+";;"+fichiersource2.readline() # le -1 pour virer le retour à la ligne
    Me reste à traiter les fins de fichier.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    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 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Citation Envoyé par trapp Voir le message
    Je n'arrive pas me servir de ce que tu me montres (surtout le splitlines malgré des recherches sur le sujet).
    dommage, car le tout s'écrirait en ces quelques lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TMPL = "2013-04-02_JeteeEst%d.csv", "2013-04-02_JeteeNord%d.csv"
    with open('essais.txt', 'w') as ff:
        for x in range(1, 3):
            with open(TMPL[0] % x) as s1, open(TMPL[1] % x) as s2:
                for z in zip(s1.read().splitlines(), s2.read().splitlines()):
                    print (';;'.join(z), file=ff)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Un programme simple qui ne s'éxecute pas
    Par malcolm41000 dans le forum C++
    Réponses: 3
    Dernier message: 01/10/2013, 19h40
  2. un programme trop simple qui ne marche pas
    Par smp82 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/10/2008, 16h46
  3. Programme super simple qui ne marche pas!
    Par _Michel dans le forum Visual C++
    Réponses: 2
    Dernier message: 07/01/2008, 19h50
  4. Réponses: 2
    Dernier message: 06/01/2008, 01h13
  5. Programme Perl tout simple qui ne fonctionne pas
    Par jejerome dans le forum Langage
    Réponses: 4
    Dernier message: 27/02/2006, 00h58

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