2017-11-06 5 views
4

Ich lese eine Textdatei mit> 10.000 Anzahl von Zeilen.Arbeiten mit Textdatei in Python

results_file = open("Region_11_1_micron_o", 'r') 

Ich möchte auf die Zeile in der Datei nach einem bestimmten Zeichenfolge „Charts“, die nicht in der Nähe von Linie tritt überspringen. 7000 (unterschiedlich für verschiedene Dateien). Gibt es eine Möglichkeit, dies bequem zu tun, ohne jede einzelne Zeile der Datei lesen zu müssen?

+0

Mögliche Duplikat [Lesen bestimmte Zeilen nur (Python)] (https versuchen könnte://stackoverflow.com/questions/2081836/reading-specific-lines-only-python) –

Antwort

5

Wenn Sie die genaue Zeilennummer kennen, können Sie die Zeile von python lesen. Sie müssen die Datei nicht öffnen.

import linecache 

line = linecache.getline("test.txt", 3) 
print(line) 

Ausgang:

chart 

Wenn Sie aus dieser Zeile zu lesen beginnen möchten, können Sie islice verwenden.

from itertools import islice 

with open('test.txt','r') as f: 
    for line in islice(f, 3, None): 
     print(line) 

Ausgang:

chart 
dang! 
It 
Works 

Wenn Sie nicht wissen, die genaue Zeilennummer und wollen nach der Zeile beginnen enthält, dass bestimmte Zeichenfolge, eine andere für Schleife verwenden.

with open('test.txt','r') as f: 
    for line in f: 
     if "chart" in line: 
      for line in f: 
       # Do your job 
       print(line) 

Ausgang:

dang! 
It  
Works 

test.txt enthält:

hello 
world! 
chart 
dang! 
It 
Works 

Ich glaube nicht, dass Sie direkt auf eine bestimmte Zeilennummer überspringen. Wenn Sie das tun wollen, müssen Sie sicher die Datei durchgegangen und die Zeilen in irgendeinem Format gespeichert haben. In jedem Fall müssen Sie die Datei mindestens einmal durchqueren.

+1

linecache liest intern die ganze Datei in den Speicher, es ist also ein Widerspruch zu den OPs. Gibt es eine Möglichkeit, das bequem zu tun, ohne jede einzelne Zeile lesen zu müssen? die Datei "muss. – erhesto

+0

@herhesto Ja, aber ich denke, wenn du irgendwohin willst, musst du die Daten irgendwo haben, oder? Nimm zum Beispiel eine Liste. Wie gehst du zu einer bestimmten Zeile, wenn du die Daten nicht irgendwo gespeichert hast? Korrigiere mich Wenn ich falsch liege. – Miraj50

+0

Nun, ich stimme dir vollkommen zu! Ich würde diese Information nur zu Ihrer Antwort hinzufügen, dass es problematisch sein könnte, einen deterministischen Algorithmus zu finden, der diese Aufgabe ausführen könnte, ohne die Datei mindestens einmal zu lesen.Natürlich könnte es in einigen Fällen möglich sein (zum Beispiel - wenn wir eine vordefinierte Anzahl von Zeichen pro Zeile haben - mit anderen Worten, wir kennen genaue Orte von Zeilenumbrüchen), aber nicht generell. – erhesto

1

Sie können itertools.dropwhile verwenden, um die Zeilen bis zu dem Punkt zu konsumieren, den Sie möchten.

from itertools import dropwhile, islice 

with open(fname) as fin: 
    start_at = dropwhile(lambda L: 'Abstract' not in L.split(), fin) 
    for line in islice(start_at, 1, None): 
     print line 
1

Wenn Ihre Textdatei hat Linien, deren Länge gleichmäßig über die Dateien verteilt wird Sie mit der Suche nach in thefile

from os import stat 
size = stat(your_file).st_size 
start = int(0.65*size) 
f = open(your_file) 
f.seek(start) 
buff = f.read() 
n = buff.index('\nchart\n') 
start = n+len('\nchart\n') 
buff = buff[start:]