Ich suche nach einer Methode in Python, die mehrere Zeilen aus einer Datei lesen kann (10 Zeilen gleichzeitig). Ich habe bereits readlines(sizehint) untersucht. Ich habe versucht, den Wert 10 zu übergeben, aber nicht nur 10 Zeilen gelesen. Es liest tatsächlich bis zum Ende der Datei (ich habe die kleine Datei anprobiert). Jede Zeile ist 11 Bytes lang und jeder Lesevorgang sollte jedes Mal 10 Zeilen abrufen. Wenn weniger als 10 Zeilen gefunden werden, geben Sie nur diese Zeilen zurück. Meine eigentliche Datei enthält mehr als 150K Zeilen.

Irgendeine Idee, wie ich das erreichen kann?

1
Rakesh 9 Okt. 2012 im 03:44

4 Antworten

Beste Antwort

Sie suchen nach itertools.islice():

with open('data.txt') as f:
    lines = []
    while True:
        line = list(islice(f, 10)) #islice returns an iterator ,so you convert it to list here.
        if line:                     
            #do something with current set of <=10 lines here
            lines.append(line)       # may be store it 
        else:
            break
    print lines    
8
Ashwini Chaudhary 7 Aug. 2015 im 10:01
from itertools import groupby, count
with open("data.txt") as f:
    groups = groupby(f, key=lambda x,c=count():next(c)//10)
    for k, v in groups:
        bunch_of_lines = list(v)
        print bunch_of_lines
0
John La Rooy 9 Okt. 2012 im 00:16

Eine andere Lösung, mit der die dumme Endlosschleife zugunsten einer bekannteren for - Schleife beseitigt werden kann, basiert auf itertools.izip_longest und einem kleinen Trick mit Iteratoren. Der Trick ist, dass zip(*[iter(iterator)]*n) iterator in Stücke der Größe n zerlegt. Da eine Datei bereits ein generatorähnlicher Iterator ist (im Gegensatz zu einer sequenzähnlichen), können wir schreiben:

from itertools import izip_longest
with open('data.txt') as f:
    for ten_lines in izip_longest(*[f]*10,fillvalue=None):
        if ten_lines[-1] is None:
           ten_lines = filter(ten_lines) #filter removes the `None` values at the end
        process(ten_lines) 
1
mgilson 9 Okt. 2012 im 00:53

Das sollte es tun

def read10Lines(fp):
    answer = []
    for i in range(10):
        answer.append(fp.readline())
    return answer

Oder das Listenverständnis:

ten_lines = [fp.readline() for _ in range(10)]

In beiden Fällen fp = open('path/to/file')

3
inspectorG4dget 8 Okt. 2012 im 23:47