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

  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 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 067
    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.

  7. #7
    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
    Citation Envoyé par eyquem Voir le message
    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.
    Je comprends pas là !
    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 -
    Ce qui est vert est correcte pour moi.

    Si je comprends bien, tu fais un test plusieurs fois sur les mêmes lignes ?

  8. #8
    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
    Désolé mais chez moi ça a l'air de tourner rond.
    Je parlais du code pas de ma tête

  9. #9
    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
    Mais mon gros soucis actuellement c'est de n'avoir que la ligne START juste avant BEND1 même si il y a 2 START.
    Comme ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    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

  10. #10
    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
    Pour le doublon START.
    Etant donné que START est toujours 0.0 0.0 0.0
    Je ne la prends pas en compte dans mon traitement de copie de fichier et je l'ajoute
    en fin de traitement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        st = "PX\t0.0\t0.0\t0.0\n"
        fileModif.write(st)
    Plus facile mais certainement pas correcte au point de vue code.

  11. #11
    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
    Je suis bien étonné de voir que tu n’as pas compris la fin de mon message #6 sur le décalage des positionnements.


    En faisant tourner le code du message #6, qui n’est rien d’autre que ton code du message #1 auquel j’ai ajouté des instructions pour afficher des données permettant de saisir ce qui se passe, on obtient le fichier suivant.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    /HEADER
    DATE                02/02/2010
    PIPELINE            QI-500800
    PIPING-SPEC         3A1
    UNITS-BORE          MM
    UNITS-LENGTH        MM
    SPOOL-ID            1
    SPOOL-PREFIX        QI-50080
    /CUT
    START               0.0      0.0      0.0      0.0      0.0
    CUT-ID                   1                                                      
    ITEM-CODE                PIPE_0.04                                              
    PART-NUMBER              5
    ND                       25                                                     
    OD                       0.000
    CUT-LENGTH               200.000
    DEV-LENGTH               217                                                    
    START-COMPONENT          TEE                                                    
    START-COMP-CODE          PIPE                                                   
    START-COMP-PART-NO       1
    START-END-TYPE           SHAPED                                                 
    /CUT
    START               0.0      0.0      0.0      0.0      0.0
    BEND1             952.3     55.8      0.0    120.0     45.0
    BEND2             -351.9   -296.1      0.0    120.0     45.0
    BEND3            473.5   0.0      0.0    120.0     90.0
    CUT-ID                   2                                                      
    ITEM-CODE                PIPE                                                   
    PART-NUMBER              1
    ND                       40                                                     
    OD                       0.000
    CUT-LENGTH               1635.000
    DEV-LENGTH               1635                                                   
    START-COMPONENT          FLANGE                                                 
    START-COMP-CODE          FLANGE                                                 
    START-COMP-PART-NO       6
    START-COMP-LENGTH        2                                                      
    START-END-TYPE           SQ.CUT                                                 
    SPOOL-ID            2
    SPOOL-PREFIX        QI-50080
    /CUT
    START               0.0      0.0      0.0      0.0      0.0
    CUT-ID                   3                                                      
    ITEM-CODE                PIPE                                                   
    PART-NUMBER              1
    ND                       40                                                     
    OD                       0.000
    CUT-LENGTH               300.000
    DEV-LENGTH               300                                                    
    START-COMPONENT          FLANGE                                                 
    START-COMP-CODE          FLANGE                                                 
    START-COMP-PART-NO       2
    START-COMP-LENGTH        1                                                      
    START-END-TYPE           SQ.CUT                                                 
    /END
    et notamment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    START               0.0      0.0      0.0      0.0      0.0
    BEND1             952.3     55.8      0.0    120.0     45.0
    BEND2             -351.9   -296.1      0.0    120.0     45.0
    BEND3            473.5   0.0      0.0    120.0     90.0
    Les nombres -351.9 et 473.5 ont leur dernier chiffre qui n’est pas positionné dans la même colonne que celui des autres. Pas difficile à voir quand même.





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



    Quant à l’erreur, je maintiens que le code du message #1 en fait pour certaines configurations de nombres dans les lignes BEND et FINISH.



    Cette erreur est bien mise en évidence dans le premier cas exposé, celui de la ligne BEND2:

    Les lignes
    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
    ne donnent une erreur que pour la ligne BEND2-colonne 1:

    656.2-952.3 = -296.1
    donc pour i==1 lors de l’exécution de ton code (i==1 correspond à la colonne 1)
    line, qui possedait la valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEND2             656.2   -296.1      0.0    120.0     45.0
    est transformée en line de valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEND2             -296.1   -296.1      0.0    120.0     45.0
    Puis pour i==2 (colonne 2), le calcul -296.1-55.8 donne -351.9
    la line de valeur toute fraiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEND2             -296.1   -296.1      0.0    120.0     45.0
    est a encore transformée en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BEND2             -351.9   -296.1      0.0    120.0     45.0

    Ce qu’il faut voir, c’est que l’instruction comportant replace() remplace la valeur -296.1 par la différence -351.9. Mais elle le fait pour la première occurence de -296.1, c’est à dire en colonne 1 et non pas 2.
    -351.9 apparaît donc en colonne 1 (écrasant ainsi la précédente valeur calculée) alors qu’il devrait apparaître en colonne 2.
    La valeur de la colonne 1 change deux fois, alors que la valeur de chaque colonne ne devrait changer qu’une fois.









    Malheureusement, il y a eu conjonction de deux choses pour que tu n’aies pas été convaincu de cette erreur



    - Tu ne t’es intéressé dans tes soulignements en vert qu’aux colonnes 2. Donc tu n’as pas remarqué ce qui se passait pour la colonne 1.



    - Par ailleurs, je me suis trompé dans les valeurs de la colonne 3 pour les lignes BEND2 ET BEND3, que j’ai données dans l'exemple.
    Il n’est donc pas apparu d’erreur pour la colonne 2 de BEND3 comme annoncé.

    En effet, en colonne 3, étant donné qu’il y a 0.0 et 0.0 sur les lignes BEND2 et BEND3, la différence est 0.0 - 0.0 = 0.0 qui vient donc en remplacement de la première occurence de 0.0 (= valeur de la colonne 3 en BEND3), cette occurence étant en colonne 2 de BEND3.

    Remplacer en colonne 2 au lieu de la colonne 3 est une erreur, mais comme c’est 0.0 qui est remplacé par 0.0, mon exemple fait pshittt.
    Et en écrivant «De même pour la ligne BEND3, -296.1 - -296.1 = 0.0 remplace -296.1 en colonne 2.», je faisais moi même une erreur.



    pfffffffffffffffffff.








    Donc revoici des lignes correctes pour mettre en évidence deux erreurs:
    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     977    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
    Cette fois, pour la colonne 3 de BEND3, on a 0.0 - 977 = -977 qui doit remplacer 0.0 de cette même colonne.

    Mais line.replace(0.0, -977, 1) va faire le remplacement à la première occurence de 0.0 dans la ligne, c’est à dire en colonne 2 où cette valeur est apparue juste avant, alors que le remplacement devrait avoir lieu en colonne 3.






    Donc ton code du message #1 est bien erroné, et pour solutionner ton problème exposé dans ce message, je propose le code suivant:


    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
    with open('piktux.txt', 'r') as f:
     
        agarder = ('ND            ', 'OD            ', 'WALL-THICKNESS')
        keepnumb = 3
     
        for line in f:
     
            if line[0:9]=='SPOOL-ID ':
                out_name = line.split()[1]
            elif line[0:13]=='SPOOL-PREFIX ':
                out_name = out_name + '^' + line.split()[1] + '.txt'
                chout = ''
                P = []
     
            elif line[0:6] ==  'START ':
                larg  = len(line.strip()) - len( line.rsplit(None,1)[0] )
                entet = len(line.strip()) - (len(line.split())-1)*larg
                if not P:
                    P = map( float,line[entet:entet+keepnumb*larg].split() )
                    chout += line[0:entet+keepnumb*larg] + '\n'
            elif line[0:4] == 'BEND':
                L = map( float,line[entet:entet+keepnumb*larg].split() )
                chout += line[0:entet]\
                         + ''.join(str(L[k]-P[k]).rjust(larg) for k in xrange(keepnumb)) + '\n'
                P = L
            elif line[0:7]=='FINISH ':
                L = map( float,line[entet:entet+keepnumb*larg].split() )
                chout += 'FINISH        '\
                         + ''.join(str(L[k]-P[k]).rjust(larg) for k in xrange(keepnumb)) + '\n'
     
            elif line[0:14] in agarder:
                chout += line
     
            elif line[0:10]=='/END-SPOOL':
                with open(out_name,'w') as g:
                    g.write(chout)

    Je suis allé jusqu’à prévoir la détermination de la longueur des en-tête devant les nombres des lignes START, BEND et FINISH (entet) et la largeur consacrée à l’écriture de chaque nombre (larg).

    Remarquer dans l’instruction
    larg = len(line.strip()) - len( line.rsplit(None,1)[0] )
    l’utilisation de la fonction rsplit() et non pas split().
    Voulant spécifier une limitation du nombre de splits réalisés à partir de la droite, je suis obligé de mettre un nombre comme argument de rsplit(), et pour éviter que ce nombre soit pris comme séparateur et provoque une erreur, il faut mettre None.
    Le reste découle logiquement.

    keepnumb = 3 est le nombre de nombres dans les lignes START, BEND et FINISH que l’on veut garder. Sa valeur est à spécifier en tete de code.

  12. #12
    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
    Bonjour eyquem,

    Je viens de vérifier avec une autre valeur que 0 et tes dires sont exactes.
    De plus ton nouveau script aligne tout les nombres ce qui est plus propre.
    Merci de ton aide et de toutes ces explications.

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