File abgewisser Stelle lesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DKKA
User
Beiträge: 45
Registriert: Freitag 18. Oktober 2013, 14:20

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?
Benutzeravatar
Balmung
User
Beiträge: 44
Registriert: Sonntag 17. März 2013, 18:36

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.
»Honk Honk«
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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:
Antworten