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 :

Récupérer certaine lignes d'un fichier


Sujet :

Python

  1. #1
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    Par défaut Récupérer certaine lignes d'un fichier
    Bonjour à tous,

    Je me suis remis à ce langage abandonné depuis un certain temps.
    Mon problème est le suivant :
    Dans un fichier texte, je désire récupérer certaines lignes. Ces parties de texte sont délimité par deux balises /SPOOL et /END-SPOOL
    J'ai donc cherché le n° de lignes de ces balises (il y en a deux de chaques) et il me faut récupérer le texte entre ces deux balises pour les copier dans un nouveau fichier.

    Voici le début :
    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
     
    f = open('QI-500800.txt', 'r')
    line = f.readline().decode('utf-8')
     
    i = 1
    listeSpool = []
    for line in iter(f):
    	if line[0:6] == "/SPOOL":
    		print line,
    		listeSpool.append(i)
    	if line[0:10] == "/END-SPOOL":
    		print line,
    		listeSpool.append(i)
     
    	i = i + 1
     
    print listeSpool
    f.close()
    Suis-je dans la bonne direction et pouvez-vous m'éclairer ?
    Merci d'avance.
    Pierre

  2. #2
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour et bienvenue dans le forum,



    C’est un besoin commun, et régulièrement exposé dans ce forum, que celui que tu exposes.
    Suggestion: chercher les files qui en parlent. C’est instructif de voir des idées diverses à propos d’un même problème connaissant des variations.



    Ceci dit, quelques remarques:

    - for line in iter(f): suffit
    f est son propre itérateur

    - les lignes que tu veux récupérer ne sont pas seulement celles qui contiennent les balises et la suite va être de parcourir les lignes entre les balises et de les recopier, n’est ce pas ?
    Je ne pense pas que ce soit la meilleure façon de faire, mais c’est une façon possible.

    Ton code ne me semble pas trop mal parti.
    Mais maintenant, que comptes tu faire des numéros de lignes ? Tu veux reparcourir le fichier pour arriver jusqu’à la première ligne avec balise et faire à ce moment là le recopiage des lignes qui suivent jusqu’à la balise suivante ?
    Mais pourquoi ne pas déclencher ce recopiage juste après avoir détecté la première balise ? Et te passer d'enregistrer les numéros de lignes.


    Sinon, si tu tiens à repérer des lignes par leur numéro, tu aurais intérêt à mettre les lignes dans une liste:

    Lines = f.readlines()
    les fins de lignes ’\n’ sont conservées

    ou

    Lines = f.read().splitlines()
    les fins de ligne sont éliminées



    Précision stp: il y a 4 lignes avec balises au total ( une /SPOOL, puis une /END-SPOOL, puis à nouveau une /SPOOL, puis une /END-SPOOL) ?



    Précise aussi la version de Python que tu utilises, stp.

  3. #3
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Bonjour et bienvenue dans le forum,
    Merci

    Citation Envoyé par eyquem Voir le message
    Ceci dit, quelques remarques:
    - for line in iter(f): suffit
    f est son propre itérateur

    - les lignes que tu veux récupérer ne sont pas seulement celles qui contiennent les balises et la suite va être de parcourir les lignes entre les balises et de les recopier, n’est ce pas ?
    Je ne pense pas que ce soit la meilleure façon de faire, mais c’est une façon possible.
    Je savais que tu allais dire ça

    Citation Envoyé par eyquem Voir le message
    Ton code ne me semble pas trop mal parti.
    Mais maintenant, que comptes tu faire des numéros de lignes ? Tu veux reparcourir le fichier pour arriver jusqu’à la première ligne avec balise et faire à ce moment là le recopiage des lignes qui suivent jusqu’à la balise suivante ?
    Mais pourquoi ne pas déclencher ce recopiage juste après avoir détecté la première balise ? Et te passer d'enregistrer les numéros de lignes.
    OK. Je vois que ta solution est la meilleur. Ca ne sert à rien de faire le travail deux fois.
    Maintenant je doit trouver les syntaxes pour ajouter les lignes concernées dans un nouveau fichier.

    Citation Envoyé par eyquem Voir le message
    Précision stp: il y a 4 lignes avec balises au total ( une /SPOOL, puis une /END-SPOOL, puis à nouveau une /SPOOL, puis une /END-SPOOL) ?
    C'est exactement ça.
    La version python est 2.6
    Merci à toi de me guider

    Pierre

  4. #4
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Si c’est un fichier entièrement nouveau, c’est facile.
    Certains veulent parfois ajouter du texte dans un fichier existant, en plein milieu, et là c’est plus délicat.

    Pour ton cas, a priori ouvre ton nouveau fichier en écriture et transfère les lignes une à une:

    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
    f = open('QI-500800.txt', 'r')
    line = f.readline().decode('utf-8')
    g = open('nouveau fichier','w')
     
    transferer = 0
    #i = 1
    #listeSpool = []
    for line in f:
    	if line[0:6] == "/SPOOL":
                    transferer = 1
    		print line
    		#listeSpool.append(i)
            if transferer==1:
                print line
                g.write(line)
    	if line[0:10] == "/END-SPOOL":
                    transferer = 0
    		print line
    		#listeSpool.append(i)
     
    #print listeSpool
    f.close()

    Je veux m’assurer de bien comprendre:
    les parties de textes que tu veux récupérer et transférer sont toutes les lignes entre deux lignes à balises /SPOOL et /END-SPOOL, y compris les lignes avec les balises, et uniquement ces lignes ?



    NB que je ne maîtrise pas les histoires de encode() et decode()

  5. #5
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Voilà l’autre genre de solution auquel je pense et qui me plaît mieux, personnellement: je traite le fichier pour ce qu’il est, une chaîne de caractères, dans laquelle il y a de ci de là des caractères de fin de lignes, mais qui n’ont pas d’intérêt particulier relativement à un problème tel que celui qui t’occupe. Je dis souvent que sur le disque dur, il n’y a pas de lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    f = open('QI-500800.txt', 'r')
    line = f.readline().decode('utf-8')
    ch = f.read()
    f.close()
     
    g = open('nouveau fichier','w')
     
    fin = 0
    while 1:
        deb = ch[fin:].find("/SPOOL")
        fin = ch[fin:].find("/END-SPOOL") + len("/END-SPOOL")
        if deb==-1:  break
        g.write( ch[deb:fin] )

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 058
    Points : 1 395
    Points
    1 395
    Par défaut
    peut-être que c'est ce que tu cherches à faire; mais je suis sûr qu'il doit y avoir une fonction pour simplifier le truc ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def spool(fichier)
           out = ''
    	with open(fichier, 'r') as f :
    		f = f.read()
    		while '/SPOOL' in f :
    			i_start = f.index('/SPOOL')
    			i_end = f.index('/END-SPOOL')
    			out = out+f[i_start+6:i_end]+'\n'
    			f = f[:i_start]+f[i_end+10:]
    		return out
     
    print spool('QI-500800.txt')

  7. #7
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    On a la même façon d’envisager la chose, josmiley.


    Cependant j’ai une critique sur ton code:

    l’instruction f = f[:i_start]+f[i_end+10:]
    crée un nouvel objet construit comme somme de f[:i_start] et f[i_end+10:] sur lequel est transféré l’étiquette f. Le problème étant qu’il y a création d’objet, ce qui est plus long que de faire un exploration dans une chaîne stable et unique avec des jeux sur indices, comme je le fais dans mon code.



    De plus, d’un point de vue algorithme, pourquoi se traîner f[:i_start] alors que par définition de i_start, il n’y a pas de balise avant cette position i_start ?

    Et tu vois que si on élimines ce f[:i_start] de l’instruction ci-dessus, il ne reste plus que f[i_end+10:] et on s’aperçoit alors que ce n’est pas la peine d’en faire un nouvel objet à renommer f.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 058
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 058
    Points : 1 395
    Points
    1 395
    Par défaut
    arf, zut, j'avais pas lu ta derniere reponse eyquem.

    De plus, d’un point de vue algorithme, pourquoi se traîner f[:i_start] alors que par définition de i_start, il n’y a pas de balise avant cette position i_start ?
    ha oué , bien vu ...

  9. #9
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Tiens, je me sens moins seul, josmiley.
    Je me sentais un peu gland à traiter seul les fichiers comme des chaînes...



    En fait il y a deux petits problèmes potentiels dans mon deuxième code:


    - la ligne contenant /END-SPOOL ne se termine peut être pas par /END-SPOOL
    S’il faut transférer les caractères qui se trouvent après /END-SPOOL dans une telle ligne, mon code est en défaut


    - s’il y a plusieurs chaînes ch[deb:fin] qui sont écrites dans le nouveau fichier, il manquera une fin de ligne entre ces chaînes

    On peut corriger en faisant soit g.write( ch[deb:fin] + ’\n’ )mais la dernière ligne aura une fin de ligne ’\n’

    Soit l’utilisation très pratique pour régler ce genre de problème de join():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fin = 0
    li = []
    while 1:
        deb = ch[fin:].find("/SPOOL")
        fin = ch[fin:].find("/END-SPOOL") + len("/END-SPOOL")
        if deb==-1:  break
        li.append( ch[deb:fin] )
     
    g.write('\n'.join(li))
    g.close()

  10. #10
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    Par défaut
    Merci à tous pour votre coup de main
    Je vous joins le contenu d'un de ces fichiers pour que vous voyez un peu le truc.
    La chaine /SPOOL et /END-SPOOL doivent figurer dans les lignes à prendre en compte.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    /HEADER
    DATE                02/02/2010
    PIPELINE            QI-500800
    PIPING-SPEC         3A1
    UNITS-BORE          MM
    UNITS-LENGTH        MM
    /SPOOL
    SPOOL-ID            1
    SPOOL-PREFIX        QI-50080
    /CUT
    START               0.0      0.0      0.0      0.0      0.0
    FINISH              0.0      0.0    217.3      0.0      0.0
    CUT-ID                   1                                                      
    ITEM-CODE                PIPE_0.04                                              
    PART-NUMBER              5
    ND                       25                                                     
    OD                       0.000
    WALL-THICKNESS           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                                                 
    FINISH-COMPONENT         NONE                                                   
    FINISH-END-TYPE          SQ.CUT                                                 
    /CUT
    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
    CUT-ID                   2                                                      
    ITEM-CODE                PIPE                                                   
    PART-NUMBER              1
    ND                       40                                                     
    OD                       0.000
    WALL-THICKNESS           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                                                 
    FINISH-COMPONENT         FLANGE                                                 
    FINISH-COMP-CODE         FLANGE                                                 
    FINISH-COMP-PART-NO      6
    FINISH-COMP-LENGTH       2                                                      
    FINISH-END-TYPE          SQ.CUT                                                 
    /END-SPOOL
    /SPOOL
    SPOOL-ID            2
    SPOOL-PREFIX        QI-50080
    /CUT
    START               0.0      0.0      0.0      0.0      0.0
    FINISH              0.0   -300.0      0.0      0.0      0.0
    CUT-ID                   3                                                      
    ITEM-CODE                PIPE                                                   
    PART-NUMBER              1
    ND                       40                                                     
    OD                       0.000
    WALL-THICKNESS           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                                                 
    FINISH-COMPONENT         NONE                                                   
    FINISH-END-TYPE          SQ.CUT                                                 
    /END-SPOOL
    /END
    Merci encore

  11. #11
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par josmiley Voir le message
    peut-être que c'est ce que tu cherches à faire; mais je suis sûr qu'il doit y avoir une fonction pour simplifier le truc ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def spool(fichier)
           out = ''
    	with open(fichier, 'r') as f :
    		f = f.read()
    		while '/SPOOL' in f :
    			i_start = f.index('/SPOOL')
    			i_end = f.index('/END-SPOOL')
    			out = out+f[i_start+6:i_end]+'\n'
    			f = f[:i_start]+f[i_end+10:]
    		return out
     
    print spool('QI-500800.txt')
    Ca je comprends ce bien ce code, mais avec ce code je n'ai pas les balises. Et ca c'est embêtant.

  12. #12
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Il y a un problème dans mon code.

    deb = ch[fin:].find("/SPOOL")

    va donner à deb la position de “/SPOOL“ par rapport à la position 0 de la chaîne ch[fin:] et non pas par rapport à la position 0 de la chaîne ch.

    pour utiliser ensuite deb, il faut donc ajouter fin. Mais la valeur de fin au moment où l’instruction deb = ch[fin:].find("/SPOOL") est exécutée.

    Or on change fin ensuite.

    J’essaie depuis un moment de résoudre le problème sans avoir à introduire un objet supplémentaire x pour enregistrer la valeur de fin au moment de l’instruction deb = ch[fin:].find("/SPOOL")

    Mais j’ai des problèmes techniques qui me retardent, bien que ce soit facile à faire.

    Solution dans un moment...plus ou moins long.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Points : 15
    Points
    15
    Par défaut
    Personnellement, j'aurai plutot vu un truc du genre:

    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
     
    # -*- coding: UTF-8 -*-
     
    # Code lisant un fichier et extrait vers un autre fichier
    # uniquement les lignes contenues entre \SPOOL et \END_SPOOL
     
    # Ouverture de deux fichiers:-------------------------------------------
    # Fichier d'origine où extraire les données
    fich_in=open('D:\\Experiences\\python_exo\\code_in.txt','r')
    # Fichier de sortie où envoyer les données
    fich_out=open('D:\\Experiences\\python_exo\\code_out.txt','w')
     
    #lecture de la première ligne pour le test while qui suit
    ligne=fich_in.readline()
     
    #Boucle qui lit le fichier jusqu'à la fin de fichier (=>ligne vide)
    while ligne!='':
        if ligne=='/SPOOL\n': # si la ligne est /SPOOL, c'est la partie à enregistrer
            while (ligne!='/END-SPOOL\n'): # On enregistre tant qu'on a pas /ENd-SPOOL
                fich_out.write(ligne) # On écrit la ligne
                ligne=fich_in.readline() # On lit la ligne suivante du fichier source
            fich_out.write(ligne) # Fin de boucle, on a lu la ligne /END-SPOOL, donc faut également l'enregistrer dans le fichier cible
        ligne=fich_in.readline() # On lit la ligne suivante pour identifier un nouveau bloc /SPOOL.../END-SPOOL grâce au while et au test If
     
    # Fin de la boucle while, le fichier a été intégralement lu
     
    # Fermeture des fichiers
    fich_in.close()
    fich_out.close()
    Tu ouvres deux fichiers. Celui du traitement et le nouveau.
    Tu check en lisant le fichier dès que tu as ta balise /SPOOL
    dès que tu las tu écris par une boucle dans le nouveau fichier et tant que tu n'as pas la balise /END-SPOOL (et pas /END_SPOOL... mon log est parti 3 fois dans une boucle infinie )

    Et tu reboucles le tout jusqu'à la fin de fichier dans le cas où il y a plusieurs blocs /SPOOL..../END-SPOOL

    Je pense qu'on peut optimiser ce code, mais il fait son boulot.

    Remarque:
    Je sais que ce code n'est pas robuste, c'était pas le but...

  14. #14
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    Par défaut
    Merci à toi, les balises sont incluent, impec

    La deuxième action est de récupérer les valeurs de SPOOL-ID et SPOOL-PREFIX pour les concaténer et créer deux fichiers. Dans ces deux fichiers nous aurions le contenu de chacune des balises /SPOOL et /END-SPOOL.
    Je sais que j'en demande beaucoup mais c'est un peu urgent. Je cherche de mon côté mais je traine
    Encore merci

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 12
    Points : 15
    Points
    15
    Par défaut
    Hola,

    Je te laisse le soin de commenter et d'optimiser:
    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
     
    # -*- coding: UTF-8 -*-
     
    # Code lisant un fichier et extrait vers un autre fichier
    # uniquement les lignes contenues entre \SPOOL et \END_SPOOL
     
     
    fich_in=open('D:\\Experiences\\python_exo\\code_in.txt','r')
     
    ligne=fich_in.readline()
    while ligne!='':
        if ligne=='/SPOOL\n':
            spool=ligne
            spoolId=fich_in.readline()
            ligneId=[]
            for C in spoolId.split(' '):
                if C!='':
                    ligneId.append(C)
            spoolPrefix=fich_in.readline()
            lignePrefix=[]
            for C in spoolPrefix.split(' '):
                if C!='':
                    lignePrefix.append(C)
            fich_out=open('D:\\Experiences\\python_exo\\'+ligneId[1][0:len(ligneId[1])-1]+lignePrefix[1][0:len(lignePrefix[1])-1]+'.txt','w')
            fich_out.write(spool)
            fich_out.write(spoolId)
            fich_out.write(spoolPrefix)
            ligne=fich_in.readline()
            while (ligne!='/END-SPOOL\n'):
                fich_out.write(ligne)
                ligne=fich_in.readline()
            fich_out.write(ligne)
            fich_out.close()
        ligne=fich_in.readline()
     
    fich_in.close()
    Je sais, c'est du bourrin mais la première chose que j'ai appris est: "Life is short, you need Python" et j'ai un gros pavé à finir d'écrire..

    bon courage !

  16. #16
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Bon, voilà mon machin.

    Bête comme tout, mais moi aussi je fais d’autres choses, et avec mon Python qui se met à planter sans cesse ça n’aide pas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with open('essai.txt', 'r') as f:
        ch = f.read()
     
    F,li = 0,[]
    while 1:
        D = F + ch[F:].find("/SPOOL")
        if D==F-1:  break
        F = D + ch[D:].find("/END-SPOOL") + len("/END-SPOOL")
        li.append( ch[ D : F ] )
     
    with open('nouveau fichier.txt','w') as g:
        g.write('\n'.join(li))

    Nota bene:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        D = F + ch[F:].find("/SPOOL")
        if D==F-1:  break
    Parce que si "/SPOOL" n’est pas dans ch[F:] ,
    alors ch[F:].find("/SPOOL") vaut -1.



    Je jette maintenant un œil sur vos derniers messages

  17. #17
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    Par défaut
    Merci à toi et aux autres.
    Il me reste à modifier certaines valeurs dans ces deux fichiers et là je crois que je vais plancher encore un peu. Reste à savoir comment je peux changer certaines valeurs.

    Merci

  18. #18
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    Par défaut
    Bon bin problème. Maintenant on me demande de n'enregistrer que certaines lignes.
    Je suppose qu'il faut ajouter un filtre avec le début de la ligne à enregistrer.

    Style : Dans les fichier enregistrés il faut juste garder les lignes qui commence par /SPOOL, SPOOL-ID, START, FINISH ..., /END-SPOOL

  19. #19
    Membre extrêmement actif
    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
    Points : 1 658
    Points
    1 658
    Par défaut
    Ah, ça je m’y attendais: le dévoilement progressif des objectifs.

    Il devient évident qu’il faut passer aux expressions régulières, sinon on va passer son temps à faire des recherches avec find() dans des bouts de chaines et à traquer des lignes.

    Voici le code de base qui t’est nécessaire dans cette démarche.

    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
    with open('piktux.txt', 'r') as f:
        ch = f.read()
     
    import re
     
    pat = re.compile('/SPOOL\r?\nSPOOL-ID\s+(\d+)\r?\n'
                     'SPOOL-PREFIX\s+(.+)\r?\n'
                     '((?:(?!/END-SPOOL).+\r?\n)+)'
                     '/END-SPOOL')
     
     
    for m in pat.finditer(ch):
        print 'm.group(1) :\n',m.group(1)
        print 'm.group(2) :\n',m.group(2)
        print '---------------------------------------------------'
        print 'repr(m.group(3)) :\n',repr(m.group(3))
        print '---------------------------------------------------'
        print 'm.group(3)) :\n',m.group(3)
        print '==========================================================='
        print '===========================================================\n\n'
    Les données dont tu as besoin sortent dans m.group(1), m.group(2) et m.group(3).

    À toi de les utiliser pour construire les fichiers que tu veux comme tu le veux.

  20. #20
    Futur Membre du Club
    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
    Points : 5
    Points
    5
    Par défaut
    Je ne comprends pas trop les m.group(1) ...

    Je pensais faire une liste comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    agarder = ('/SPOOL', 'SPOOL-ID', 'SPOOL-PREFIX', 'START', 'FINISH', 'ND', 'OD', 'WALL-THICKNESS', 'BEND1', 'BEND2', 'BEND3', '/END-SPOOL')
    Et l'utiliser comme filtre.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [PowerShell] Comment récupérer certaines lignes d'un fichier pour ensuite s'en servir
    Par Zipper963 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 13/12/2012, 15h35
  2. [PowerShell] Récupérer certaines lignes d'un fichier txt dans un autre
    Par TanKer dans le forum Scripts/Batch
    Réponses: 7
    Dernier message: 16/11/2011, 21h31
  3. Lire certaines lignes d'un fichier csv
    Par damdam44 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 12/05/2008, 11h29
  4. Réponses: 1
    Dernier message: 05/10/2006, 09h56
  5. Supprimer certaines lignes d'un fichier texte
    Par kek_net dans le forum Langage
    Réponses: 2
    Dernier message: 10/04/2006, 11h21

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