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 :

action sur des lignes dans un fichier


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut action sur des lignes dans un fichier
    Bonjour à tous,
    Je coince sur ce problème :

    les données dans le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SPOOL-ID            1
    SPOOL-PREFIX        QI-50080
    START               0.0      0.0      0.0      0.0      0.0
    START               0.0      0.0      0.0      0.0      0.0
    BEND1             360.0      0.0      0.0    120.0     45.0
    BEND2             296.2   -296.1      0.0    120.0     45.0
    BEND3            473.5   0.0      0.0    120.0     90.0
    Je désire pour terminer ce travail de supprimer la première ligne START.
    et ensuite supprimer toutes les deux dernières colonnes pour n'avoir au final que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SPOOL-ID            1
    SPOOL-PREFIX        QI-50080
    START               0.0      0.0      0.0
    BEND1             360.0      0.0      0.0 
    BEND2             296.2   -296.1      0.0
    BEND3            473.5   0.0      0.0
    Et ça avec ce 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
    for filenames in glob.glob(os.path.join(rep_cour,"atraiter\\result\\*.txt")) :
    	fich_in = open(filenames, 'r')
    	(rep, new_name) = os.path.split(filenames)
     
    	fileModif = open(os.path.join("atraiter\\pass2", new_name), 'w')
     
    	#print fich_in
    	#print fileModif
     
    	#boucle les lignes
    	for line in fich_in :
    		#split la ligne en enlevant les espaces
    		info = re.split("\s*", line)
     
    		#si le nom est START, stoque les valeurs pour pouvoir les soustraire
    		if info[0] == "START" :
    			infoPrec = info
     
    		#si le nopm commence par BEND, modifie la ligne
    		elif info[0][:4] == "BEND":
    			#boucle les 3 chiffres
    			for i in range(1,4):
    				#la nouvelle valeur
    				newVal = str(float(info[i]) - float(infoPrec[i]))
    				#remplace l'ancienne valeur par la nouvelle
    				line = line.replace(info[i], newVal, 1)
    			#stoque les valeurs pour le prochain BEND
    			infoPrec = info
     
    		#ecrit la ligne dans le fichier
    		if line[0:6] != "/SPOOL" and line[0:14] != "WALL-THICKNESS" and line[0:6] != "FINISH" and line[0:10] != "/END-SPOOL":
    			fileModif.write(line)	
    	fileModif.close()	
    	fich_in.close()
    un principe ou un chemin à suivre serait le bienvenue.
    Encore merci à vous.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    les codes que nous t'avons donnés pour les 2 premiers problèmes suffisent largement à répondre à celui-ci ...

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    Heu oui mais bon, j'suis pas non plus fortich
    J'a&i trouvé pour le START mais pour la suppression des 2 dernières colonnes

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Y a pas mal de problèmes.

    Je regarde ça mais je manque de temps, et pour te dire franchement, je trouve que c’est le bazar dans ton algorithme.

    Suite dans un certain temps.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 33
    Par défaut
    Merci
    J'ai réussi à avoir le résultat que je voulais mais c'est pas propre du tout.
    Va falloir que je plonge dedans quand j'aurais du temps.

    J'ai ajouté ce code à la fin du fichier de 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
     
    #FINAL
    # création répertoire pour les fichiers finaux
    if not os.path.exists(rep_cour + '/atraiter/final') :
    	os.mkdir(rep_cour + '/atraiter/final')
     
    # Liste fichiers dans le répertoire
    for filenames in glob.glob(rep_cour + '\\atraiter\\pass3\\*.txt') :
    	fich_in = open(filenames, 'r')
    	(rep, new_name) = os.path.split(filenames)
    	fileModif = open(os.path.join("atraiter\\final", new_name), 'w')
     
    	for line in fich_in :
    		info = re.split("\s*", line)
    		info = info[:4]
     
    		for line in info :
    			result = "\t".join(info)
    		fileModif.write(result + "\n")
     
    	fileModif.close()	
    	fich_in.close()
    Pas la tête svp

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    L’agorithme du code dans le message 1 de cette file est incorrect.



    Pour le mettre en évidence, j’ai remplacé les lignes suivantes de ton fichier du message
    http://www.developpez.net/forums/d87...r/#post4969309

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    START               0.0      0.0      0.0      0.0      0.0
    BEND1             360.0      0.0      0.0    120.0     45.0
    BEND2             656.2   -296.1      0.0    120.0     45.0
    BEND3            1129.7   -296.1      0.0    120.0     90.0
    FINISH           1129.7   -741.1      0.0      0.0      0.0
    par celles-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    START               0.0      0.0      0.0      0.0      0.0
    BEND1             952.3     55.8      0.0    120.0     45.0
    BEND2             656.2   -296.1      0.0    120.0     45.0
    BEND3            1129.7   -296.1      0.0    120.0     90.0
    FINISH           1129.7   -741.1      0.0      0.0      0.0


    Le truc, c’est que pour la ligne BEND2
    656.2 - 952.3 = -296.1
    c’est à dire l’apparition dans la ligne BEND2 modifiée d’une valeur de remplacement -296.1 dans la colonne 1 qui se trouve déjà dans la colonne 2

    ==> quand la colonne 2 est traitée, le remplacement effectué par
    line = line.replace(-296.1,newVal, 1) se produit uniquement en colonne 1 puisque le 1 dans replace() commande un seul remplacement:
    apparition de -351.9 dans la colonne 1 en écrasant la bonne valeur -296.1
    alors que -296.1 dans la colonne 2 reste à tort identique.

    Mais même s’il y avait seulement line = line.replace(-296.1,newVal)
    il y aurait remplacement dans les deux colonnes 1 et 2 par la même valeur issue de la différence des colonnes 2 (c’est à dire 0.0) , ce qui n’est pas non plus ce qui est voulu.




    De même pour la ligne BEND3,
    -296.1 - -296.1 = 0.0
    remplace -296.1 en colonne 2.

    ==> quand est exécutée ensuite line = line.replace(0.0, newVal, 1) pour la colonne 3, le remplacement se produit en fait dans la 2.

    Ceci se produit pour les deux lignes BEND2 et BEND3 de ton fichier donné dans le message
    http://www.developpez.net/forums/d87...r/#post4969309
    sans même avoir eu à changer des valeurs dans ces lignes pour observer cette erreur.





    Ci-joint un code pour suivre précisément ce genre d’erreur:


    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
    import re
     
    filenames = 'piktux2.txt'
    fileModif = open('zz piktux2 modifie.txt','w')
     
    fich_in = open(filenames, 'r')
     
    #boucle les lignes
    for line in fich_in :
            #split la ligne en enlevant les espaces
            info = re.split("\s*", line)
     
            #si le nom est START, stoque les valeurs pour pouvoir les soustraire
            if info[0] == "START" :
                    infoPrec = info
     
            #si le nopm commence par BEND, modifie la ligne
            elif info[0][:4] == "BEND":
                    print '\n-----------------------------------------------------------'
                    print 'ligne: ',repr(line),'\n'
                    #boucle les 3 chiffres
                    for i in range(1,4):
                            #la nouvelle valeur
                            newVal = str(float(info[i]) - float(infoPrec[i]))
                            print 'col='+str(i)+', infoPrec['+str(i)+'] = '+infoPrec[i]+', info['+str(i)+'] =',info[i],'remplacé par',info[i],'-',infoPrec[i],'=',newVal
                            print line[:-1]
                            line = line.replace(info[i], newVal, 1)
                            print line[:-1],' modifiée'
                    #stoque les valeurs pour le prochain BEND
                    infoPrec = info
     
            #ecrit la ligne dans le fichier
            if line[0:6] != "/SPOOL" and line[0:14] != "WALL-THICKNESS" and line[0:6] != "FINISH" and line[0:10] != "/END-SPOOL":
                    fileModif.write(line)	
    fileModif.close()	
    fich_in.close()
     
    print '--- fin du programme -'

    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
    -----------------------------------------------------------
    ligne:  'BEND1             952.3     55.8      0.0    120.0     45.0\n' 
    
    col=1, infoPrec[1] = 0.0, info[1] = 952.3 remplacé par 952.3 - 0.0 = 952.3
    BEND1             952.3     55.8      0.0    120.0     45.0
    BEND1             952.3     55.8      0.0    120.0     45.0  modifiée
    col=2, infoPrec[2] = 0.0, info[2] = 55.8 remplacé par 55.8 - 0.0 = 55.8
    BEND1             952.3     55.8      0.0    120.0     45.0
    BEND1             952.3     55.8      0.0    120.0     45.0  modifiée
    col=3, infoPrec[3] = 0.0, info[3] = 0.0 remplacé par 0.0 - 0.0 = 0.0
    BEND1             952.3     55.8      0.0    120.0     45.0
    BEND1             952.3     55.8      0.0    120.0     45.0  modifiée
    
    -----------------------------------------------------------
    ligne:  'BEND2             656.2   -296.1      0.0    120.0     45.0\n' 
    
    col=1, infoPrec[1] = 952.3, info[1] = 656.2 remplacé par 656.2 - 952.3 = -296.1
    BEND2             656.2   -296.1      0.0    120.0     45.0
    BEND2             -296.1   -296.1      0.0    120.0     45.0  modifiée
    col=2, infoPrec[2] = 55.8, info[2] = -296.1 remplacé par -296.1 - 55.8 = -351.9
    BEND2             -296.1   -296.1      0.0    120.0     45.0
    BEND2             -351.9   -296.1      0.0    120.0     45.0  modifiée
    col=3, infoPrec[3] = 0.0, info[3] = 0.0 remplacé par 0.0 - 0.0 = 0.0
    BEND2             -351.9   -296.1      0.0    120.0     45.0
    BEND2             -351.9   -296.1      0.0    120.0     45.0  modifiée
    
    -----------------------------------------------------------
    ligne:  'BEND3            1129.7   -296.1      0.0    120.0     90.0\n' 
    
    col=1, infoPrec[1] = 656.2, info[1] = 1129.7 remplacé par 1129.7 - 656.2 = 473.5
    BEND3            1129.7   -296.1      0.0    120.0     90.0
    BEND3            473.5   -296.1      0.0    120.0     90.0  modifiée
    col=2, infoPrec[2] = -296.1, info[2] = -296.1 remplacé par -296.1 - -296.1 = 0.0
    BEND3            473.5   -296.1      0.0    120.0     90.0
    BEND3            473.5   0.0      0.0    120.0     90.0  modifiée
    col=3, infoPrec[3] = 0.0, info[3] = 0.0 remplacé par 0.0 - 0.0 = 0.0
    BEND3            473.5   0.0      0.0    120.0     90.0
    BEND3            473.5   0.0      0.0    120.0     90.0  modifiée
    --- fin du programme -

    --------------------------------------------


    Il y a un autre problème obsevable dans le résultat ci-dessus:

    par exemple pour la colonne 1 de la ligne BEND2:
    remplacement de 656.2 par -296.1

    et pour la collone 1 de la ligne BEND3:
    remplacement de 1129.7 par 473.5

    la longueur de la chaîne représentant le nombre n’est plus la même –> le positionnement des nombres dans la ligne modifiée n’est plus la même.

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/02/2015, 11h54
  2. [CSV] Ajouter et supprimer des ligne dans un fichier CSV
    Par gpsevasion dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2007, 17h00
  3. Ajouter des lignes dans un fichier *.log
    Par Fred2209 dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/12/2006, 15h15
  4. Recupérer des lignes dans un fichier ou une variable
    Par vince2005 dans le forum Langage
    Réponses: 12
    Dernier message: 29/09/2006, 18h46

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