Seite 1 von 1

File abgewisser Stelle lesen

Verfasst: Montag 17. Februar 2014, 01:58
von DKKA
Hallo,

Gibt es eine Möglichkeit wie ich ein Txt-File öffnen kann und dann direkt an eine gewisse Stelle (z.B. character 200) springen kann und erst von dort lesen kann?
Beispielsweise mein txt-file sieht so aus:
"#Kommentar.....
#......
#.......
#.......Hier fängt es an interessant zu werden....."

Wie kann ich jetzt zum "H" springen ohne das ganze File einzulesen und abzuscannen?

Re: File abgewisser Stelle lesen

Verfasst: Montag 17. Februar 2014, 02:32
von Balmung

Code: Alles auswählen

f=open('filename', 'r')
f.seek(200)
Springt zur Position 200, und jedes weitere f.read liest dann von dort.
Es ist allerdings nicht möglich, ohne die Datei einzulesen, zu einem bestimmten Buchstaben/Wort etc. zu springen. Seek ergibt nur sinn, wenn man die gewünschte Position kennt.

Re: File abgewisser Stelle lesen

Verfasst: Montag 17. Februar 2014, 10:56
von cofi
Weil ihr beide von "Position" redet, was keinen Sinn ergibt, `file.seek` springt zu einem _Byte_ Offset. Soll heissen: Abhaengig von der Kodierung landet man nicht bei Zeichen 200 sondern vielleicht bei Zeichen 100, 50 oder ganz anders.

Re: File abgewisser Stelle lesen

Verfasst: Montag 17. Februar 2014, 11:02
von Hyperion
DKKA hat geschrieben: Wie kann ich jetzt zum "H" springen ohne das ganze File einzulesen und abzuscannen?
Auch wenn cofi es implizit schon gesagt hat: Gar nicht!

Du kannst aber über die Text-Datei iterieren, *ohne* alle Zeilen im Speicher halten zu müssen. Sobald Du an die "spannende" Stelle kommst, fängst Du eben mit der Verarbeitung an. Löst das Dein Problem vielleicht schon?

Re: File abgewisser Stelle lesen

Verfasst: Montag 17. Februar 2014, 11:24
von snafu
@DKKA: Das ist so ähnlich wie bei http://www.python-forum.de/viewtopic.ph ... 33#p252933. Du liest die Daten zeilenweise und machst eine Fallunterscheidung.

Fall 1: Die gesuchte Zeile wurde gefunden -> Setze entsprechende Markierung.

Fall 2: Die Markierung ist gesetzt -> Mache mit der aktuellen Zeile eine entsprechende Verarbeitung.

Fall 3 (falls nötig): Der interessante Bereich wurde verlassen -> Setze die Markierung wieder auf "False".

EDIT: Man kann alternativ auch einen Iterator erzeugen und diesen ab der interessanten Stelle an die Verarbeitungsfunktion übergeben. Diese müsste dann wissen, wann sie die Verarbeitung beenden soll (also: wann Fall 3 eintritt). Die nächste Zeile würde dann jeweils mittels `next(dein_iterator)` geholt werden. Sofern die Datei mit `open(dateipfad)` geöffnet wurde, wird übrigens automatisch ein passendes Dateiobjekt geliefert, das via `next(dateiobjekt)` die nächste Zeile für den Datenstrom ausspuckt.

EDIT2: Vergiss bitte alles ab `next()`. Selbstverständlich kann man auch über den an die Funktion übergebenen Iterator eine `for`-Schleife machen, ich Dummerchen... :oops: