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. #21
    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
    Les regex répondent du tac au tac. On voit bien leur avantage par rapport à des pratiques de saute-mouton dans des lignes de fichier.

    Vois ce que tu peux faire avec les lignes capturées dans pat.findall(ch)

    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
    with open('piktux.txt', 'r') as f:
        ch = f.read()
     
    import re
     
     
    capt = ('(/SPOOL.*\r?\n',
            'SPOOL-ID\s+(\d+)\r?\n','SPOOL-PREFIX\s+(.+)\r?\n',
            'START.+\r?\n','FINISH.+\r?\n','/END-SPOOL.+\r?\n)')
     
    pat = re.compile('|'.join(capt))
     
     
    for u in pat.findall(ch):
        print u

  2. #22
    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
    pat.finditer(ch) est un itérateur
    Quand on fait
    for m in pat.finditer(ch):
    l’itérateur crachote des objets m l’un après l’autre.

    J’appelle ces objets de façon concise m parce que ce sont des MatchObjects, ils contiennent de l’information.

    On les interroge pour obtenir certaines données de cette information par des méthodes.

    La méthode group(x) permet d’obtenir la portion de chaîne capturée par le x ième groupe défini dans la RE. Un groupe est défini par des parenthèses.



    Tu as le choix:

    - soit tu te prends un peu la tête pour apprendre le minimum sur les regex (ce n’est pas si compliqué que ça) et ton problème devient facile

    - soit tu t’octroies la facilité d’éviter d’étudier les regex et alors bonjour la prise de tête pour faire des traitements de fichier comme tu en as besoin.

    C’est mon avis et je le partage.



    Quelqu’un s’est déclaré satisfait des explications succintes sur les regex que j’ai écrites il y a peu de jours dans ce post:

    http://www.developpez.net/forums/d86...o/#post4943788

  3. #23
    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
    Je verrais bien de définir la RE à partir

    de ta liste –> agarder (j’en fais un tuple dans le code, c’est plus léger)

    et d’une chaîne écrite à part pour les lignes dans lesquelles on définit des groupes pour attraper certaines données –> gr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    gr = 'SPOOL-ID\s+(\d+)\r?\n|SPOOL-PREFIX\s+(.+)\r?\n'
     
    agarder = ('/SPOOL', 'START', 'FINISH', 'ND', 'OD', 'WALL-THICKNESS',
               'BEND1', 'BEND2', 'BEND3', '/END-SPOOL')
     
    RE = '(' + '|'.join(u+'.*\r?\n' for u in agarder) + gr + ')'
     
    pat = re.compile(RE)

  4. #24
    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
    Ha oui merci.
    J'ai ajouter des espaces après les noms pour ne garder que START et non START-COMP.

    Mais j'essaie de l'inclure dans mon code mais j'arrive pas à le faire fonctionner, je vais cogiter un peu et encore merci pour l'aide précieuse.

  5. #25
    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
    petite précision qui a son importance

    si on écrit
    gr = 'SPOOL-ID\s+(\d+)\r?\n|SPOOL-PREFIX\s+(.+)\r?\n'
    et que gr intervient APRES '(' + '|'.join(u+'.*\r?\n' for u in agarder) !

    les caractères de la ligne SPOOL-PREFIX sont attrapés par le groupe 3
    et ceux de la ligne SPOOL-ID sont attrapés par le groupe 2



    Si on écrit
    gr = 'SPOOL-PREFIX\s+(.+)\r?\n|SPOOL-ID\s+(\d+)\r?\n’
    et gr toukours APRES '(' + '|'.join(u+'.*\r?\n' for u in agarder)

    c’est l’inverse





    Le numéro d’un groupe se définit par le numéro de la parenthèse ouvrante qui le définit dans la RE.

    Le numéro d’une parenthèse ouvrante étant son numéro quand on compte les parenthèses de gauche à droite dans la RE.

    Mais on ne compte pas les parenthès suivies de ?:
    car (?: ) définit un groupe non capturant.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    je rentre à peine du taff, alors pour corriger mon code en bois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def spool(fichier) :
    	out = ''
    	i_end = 0
    	with open(fichier, 'r') as f :
    		f = f.read()
    		try :
    			while True :
    				i_start = i_end + f[i_end:].index('/SPOOL')
    				i_end = i_end + f[i_end:].index('/END-SPOOL') + 10
    				out = out+f[i_start:i_end]+'\n'
    		except :
    			return out
     
    print spool('QI-500800.txt')

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    Citation Envoyé par piktux Voir le message
    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
    je comprends pas bien le probleme ... tu peux préciser ?

  8. #28
    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
    je comprends pas bien le probleme ... tu peux préciser ?
    Salut,
    Dans les deux fichiers créés il faut juste y enregistrer les lignes commençant par ce qui est dans cette liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    agarder = ('/SPOOL', 'START', 'FINISH', 'ND', 'OD', 'WALL-THICKNESS',
               'BEND1', 'BEND2', 'BEND3', '/END-SPOOL')

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    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
    def spool(fichier) :
    	ls = ('/SPOOL', 'START', 'FINISH', 'ND', 'OD', 'WALL-THICKNESS', 'BEND1', 'BEND2', 'BEND3', '/END-SPOOL')
    	out = ''
    	i_end = 0
    	with open(fichier, 'r') as f :
    		f = f.read()
    		try :
    			while True :
    				i_start = i_end + f[i_end:].index('/SPOOL')
    				i_end = i_end + f[i_end:].index('/END-SPOOL') + 10
    				out += f[i_start:i_end]
    		except :
    			return '\n'.join([i for i in out.strip().split('\n') if i.split()[0] in ls])
     
    print spool('spool.txt')
    en fait si on savait à quoi ressemble l'input on saurait où on va. Si chaques lignes commencent par une balise on peut aussi faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def spool(fichier) :
    	flag = False
    	out = ''
    	with open(fichier, 'r') as f :
    		for l in f .read().strip().split('\n'):
    			if l.split()[0] in ('/SPOOL', '/END-SPOOL') : flag = not flag
    			if l.split()[0] in ('/SPOOL', 'START', 'FINISH', 'ND', 'OD', 'WALL-THICKNESS', 'BEND1', 'BEND2', 'BEND3', '/END-SPOOL') and flag : out += l+'\n'
    	return out
     
    print spool('spool.txt')
    si les lignes recherchées se trouvent forcement entre les balises \SPOOL et \END-SPOOL, seul suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def spool(fichier) :
    	return '\n'.join([ l for l in open(fichier, 'r').read().strip().split('\n') if l.split()[0] in ('/SPOOL', 'START', 'FINISH', 'ND', 'OD', 'WALL-THICKNESS', 'BEND1', 'BEND2', 'BEND3', '/END-SPOOL')])
     
    print spool('spool.txt')
    Non, je rigole, c'était juste pour en faire hurler quelques uns ^^

  10. #30
    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
    en fait si on savait à quoi ressemble l'input on saurait où on va.
    Il y a un exemple sur la première page.

    Citation Envoyé par josmiley Voir le message
    si les lignes recherchées se trouvent forcement entre les balises \SPOOL et \END-SPOOL, seul suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def spool(fichier) :
    	return '\n'.join([ l for l in open(fichier, 'r').read().strip().split('\n') if l.split()[0] in ('/SPOOL', 'START', 'FINISH', 'ND', 'OD', 'WALL-THICKNESS', 'BEND1', 'BEND2', 'BEND3', '/END-SPOOL')])
     
    print spool('spool.txt')
    Non, je rigole, c'était juste pour en faire hurler quelques uns ^^
    Je sais pas pourquoi ça hurlerais mais le principe fonctionne bien avec cette dernière. Sauf qu'il ne découpe pas le fichier en deux comme expliquer plus haut.

    Merci à toi de te pencher sur mon problème.

  11. #31
    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
    pat.finditer(ch) est un itérateur
    Quand on fait
    for m in pat.finditer(ch):
    l’itérateur crachote des objets m l’un après l’autre.

    J’appelle ces objets de façon concise m parce que ce sont des MatchObjects, ils contiennent de l’information.

    On les interroge pour obtenir certaines données de cette information par des méthodes.

    La méthode group(x) permet d’obtenir la portion de chaîne capturée par le x ième groupe défini dans la RE. Un groupe est défini par des parenthèses.



    Tu as le choix:

    - soit tu te prends un peu la tête pour apprendre le minimum sur les regex (ce n’est pas si compliqué que ça) et ton problème devient facile

    - soit tu t’octroies la facilité d’éviter d’étudier les regex et alors bonjour la prise de tête pour faire des traitements de fichier comme tu en as besoin.

    C’est mon avis et je le partage.



    Quelqu’un s’est déclaré satisfait des explications succintes sur les regex que j’ai écrites il y a peu de jours dans ce post:

    http://www.developpez.net/forums/d86...o/#post4943788
    Merci à toi pour ces infos. J'avais déjà un peu de mal avec les regex en php

  12. #32
    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
    Décidément, je n'arrive pas a placer le filtre dans le code

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    Citation Envoyé par piktux Voir le message
    Je sais pas pourquoi ça hurlerais mais le principe fonctionne bien avec cette dernière. Sauf qu'il ne découpe pas le fichier en deux comme expliquer plus haut.
    hurler, parce que le code est illisible et depasse largement les 80 caracteres par ligne.

    il faut creer un fichier pour chaque section \SPOOL\END-SPOOL ?

  14. #34
    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
    Ha ok

    Oui, deux fichiers comme dit ici : http://www.developpez.net/forums/d87...r/#post4969869

  15. #35
    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
    Comme je suis pris par le temps pour traiter les fichiers textes j'ai fait le filtre à la bourrin.

    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
     
    import os
    fich_in = open('QI-500800.txt','r') 
    ligne = fich_in.readline()
     
    while ligne != '' :
    	newligne = []
    	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(lignePrefix[1][0:len(lignePrefix[1])-1] + ligneId[1][0:len(ligneId[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') :
    			if ligne[0:6] == '/SPOOL' or ligne[0:8] == 'SPOOL-ID' or ligne[0:12] == 'SPOOL-PREFIX' or ligne[0:6] == 'START ' or ligne[0:7] == 'FINISH ' or ligne[0:2] == 'ND' or ligne[0:2] == 'OD' or ligne[0:14] == 'WALL-THICKNESS' or ligne[0:5] == 'BEND1' or ligne[0:5] == 'BEND2' or ligne[0:5] == 'BEND3' or ligne[0:10] == '/END-SPOOL' : 
    				fich_out.write(ligne)
    			ligne = fich_in.readline()
    		fich_out.write(ligne)
    		fich_out.close()
    	ligne = fich_in.readline()
    fich_in.close()
    Je sais que vous allez faire des bonds mais j'aurais le temps plus tard de faire ça bien pour une autre affaire

    Maintenant que mes 2 fichiers sont créés il me faut changer des valeurs sur les lignes Bend1 --> Bend3.
    Je ne sais pas encore je dois les changer, j'attends les infos du client.
    Si on peut encore me donner un coup de main sur ce sujet ?

    Merci

  16. #36
    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
    J'ai reçu la façon de recalculer les valeurs des Bend.

    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
    Je prend BEND1 et sa première valeur qui est 360.
    La valeur qui remplacera 360 est 360 - 0 (qui est la valeur de la ligne précédente) = 360.

    Je prends BEND2 et sa première valeur qui est 656,2.
    La valeur qui remplacera 656,2 est 656,2 - 360 = 296,2

    Et ainsi de suite. Sur les trois lignes BEND et sur les 3 première colonnes.
    Je pensais faire un deuxième script pour l'appliquer à tout un répertoire.

    Ca se complique sérieux

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    j'ai rien comprite à ton code; même si t'as mis résolu je me permet ...
    je ne sais si c'est bien e que tu veux.

    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
    def spool(fichier) :
    	fname = ''
    	out = ''
    	for l in open(fichier, 'r').readlines() :
    		try : bl = l.split()[0]
    		except : continue
    		if bl in ('/SPOOL', 'START', 'FINISH', 'ND', 'OD', 'WALL-THICKNESS', 'BEND1', 'BEND2', 'BEND3', '/END-SPOOL') : out += l
    		if bl in ('SPOOL-ID', 'SPOOL-PREFIX') : fname = l.split()[1] + fname
    		if bl == '/END-SPOOL' :
    			with open(fname+'.txt','w') as outfile :
    				outfile.write(out)
    			fname = ''
    			out = ''
     
    spool('QI-500800.txt')

  18. #38
    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 josmiley. C'est beaucoup plus court

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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