2010-03-19 3 views
1

Je suis en train d'extraire le texte entre qui a un fichier texte spécifique:Python pour extraire des données d'un fichier

---- 
data1 
data1 
data1 
extractme 
---- 
data2 
data2 
data2 
---- 
data3 
data3 
extractme 
---- 

puis le jeter dans un fichier texte afin que

---- 
data1 
data1 
data1 
extractme 
--- 
data3 
data3 
extractme 
--- 

Merci pour la Aidez-moi.

+3

Quel code avez-vous essayé? –

Répondre

5

Cela fonctionne assez bien pour moi. Vos données de l'échantillon est dans un fichier appelé « data.txt » et la sortie passe à « result.txt »

inFile = open("data.txt") 
outFile = open("result.txt", "w") 
buffer = [] 
keepCurrentSet = True 
for line in inFile: 
    buffer.append(line) 
    if line.startswith("----"): 
     #---- starts a new data set 
     if keepCurrentSet: 
      outFile.write("".join(buffer)) 
     #now reset our state 
     keepCurrentSet = False 
     buffer = [] 
    elif line.startswith("extractme"): 
     keepCurrentSet = True 
inFile.close() 
outFile.close() 
+0

Merci beaucoup Peter, j'ai essayé vos scripts exacts et ça fonctionne parfaitement la première fois. Merci –

2

Pour python2

#!/usr/bin/env python 

with open("infile.txt") as infile: 
    with open("outfile.txt","w") as outfile: 
     collector = [] 
     for line in infile: 
      if line.startswith("----"): 
       collector = [] 
      collector.append(line) 
      if line.startswith("extractme"): 
       for outline in collector: 
        outfile.write(outline) 

pour python3

#!/usr/bin/env python3 

with open("infile.txt") as infile, open("outfile.txt","w") as outfile: 
    collector = [] 
    for line in infile: 
     if line.startswith("----"): 
      collector = [] 
     collector.append(line) 
     if line.startswith("extractme"): 
      for outline in collector: 
       outfile.write(outline) 
5

J'imagine que la variation du nombre de tirets (4 dans l'entrée, parfois 4 et parfois 3 la sortie) est une erreur et n'est pas vraiment désirée (puisque aucun algorithme n'est même allumé, pour expliquer combien de tirets doivent être sortis à différentes occasions).

Je structurer la tâche en termes de lecture et produisant un bloc de lignes à la fois:

def readbyblock(f): 
    while True: 
     block = [] 
     for line in f: 
      if line = '----\n': break 
      block.append(line) 
     if not block: break 
     yield block 

de telle sorte que la sortie (sélective) peut être séparé d'une manière ordonnée à partir de l'entrée:

with open('infile.txt') as fin: 
    with open('oufile.txt', 'w') as fou: 
     for block in readbyblock(fin): 
      if 'extractme\n' in block: 
       fou.writelines(block) 
       fou.write('----\n') 

Ce n'est pas optimal, en termes de performances, si les blocs sont volumineux, car il comporte une boucle distincte sur toutes les lignes du bloc implicite dans la clause if. Donc, un bon refactoring pourrait être:

def selectivereadbyblock(f, marker='extractme\n'): 
    while True: 
     block = [] 
     extract = False 
     for line in f: 
      if line = '----\n': break 
      block.append(line) 
      if line==marker: extract = True 
     if not block: break 
     if extract: yield block 

with open('infile.txt') as fin: 
    with open('oufile.txt', 'w') as fou: 
     for block in selectivereadbyblock(fin): 
      fou.writelines(block) 
      fou.write('----\n') 

les séparateurs Paramétrer (maintenant codé en dur « ---- \ n » pour l'entrée et la sortie) est un autre tweak de codage raisonnable.

+1

+1 pour montrer votre travail. Particulièrement agréable est le refactor pour utiliser un générateur. J'aime aussi les noms «fin» et «fou» pour leur caractère concis. – bernie

1
data=open("file").read().split("----") 
print '----'.join([ i for i in data if "extractme" in i ]) 
Questions connexes