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?
File abgewisser Stelle lesen
Code: Alles auswählen
f=open('filename', 'r')
f.seek(200)
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«
- 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.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Auch wenn cofi es implizit schon gesagt hat: Gar nicht!DKKA hat geschrieben: Wie kann ich jetzt zum "H" springen ohne das ganze File einzulesen und abzuscannen?
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
assert encoding_kapiert
@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...
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...