Letzte Zeile einer Text Datei 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
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Hallo Liebe Python Freund

Ich habe mal eine Banale Frage in der ich im Netz einfach keine lösung
gefunden habe :cry:

Wie kann ich mit einer while schleife, in einer txt Datei immer
nur die Letzte zeile auslesen.

LG ST
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

files.readlines() und slicing sind deine Freunde.
BlackJack

@querdenker: IMHO keine guten Freunde, das skaliert nicht besonders gut mit der Dateigrösse.

@sttrader: Warum ``while``? Eine ``for``-Schleife über die Datei wäre einfacher.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und für sehr große Dateien vielleicht so in der Art:

Code: Alles auswählen

import os

def last_line(filename, chunk_size=80):
    nl = os.linesep
    with open(filename) as f:
        while True:
            f.seek(-(chunk_size), 2)
            chunk = f.read()
            if nl in chunk[:-1]:
                return chunk.splitlines()[-1]
            chunk_size *= 2
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

@snafu: Das funktioniert so nicht. Du öffnest die Datei im Textmodus, also wirst du immer nur '\n' als Zeilenseparator bekommen und deshalb wird ``os.linesep in chunk`` beispielsweise unter Windows nicht wahr.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich dachte, Python würde inzwischen standardmäßig "universal newlines" aktivieren. Na dann halt etwas weniger low-leveliger. So viel wird das Erstellen einer Liste in diesem Fall schon nicht ausmachen, oder?

Code: Alles auswählen

def last_line(filename, chunk_size=80):
    with open(filename) as f:
        while True:
            f.seek(-(chunk_size), 2)
            lines = f.read().splitlines()
            if len(lines) > 1:
                return lines[-1]
            chunk_size *= 2
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

@BlackJack: Da sttrader nichts über die Dateigröße gesagt hat...Ansonsten hast du recht. Bei einer bekannten (zu erwartenden) Größe und eventuell noch ein paar Zeilen aus der Textdatei hätte ich auch was anderes vorgeschlagen.
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

BlackJack hat geschrieben:@querdenker: IMHO keine guten Freunde, das skaliert nicht besonders gut mit der Dateigrösse.

@sttrader: Warum ``while``? Eine ``for``-Schleife über die Datei wäre einfacher.
Hallo ihr alle

Danke für eure Hilfsbereitschaft :)
Warum while schleife weil ich eine txt Datei für mein Trading Bot
überwachen muss in der die Kauf und Verkaufs Aufträge Real Time
eingetragen werden. Wenn es da Änderungen gibt sollen sie ausgelesen werden.

Im extrem Fall ist die Datei 200 - 300 Zeilen gross

LG ST
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

snafu hat geschrieben:Ich dachte, Python würde inzwischen standardmäßig "universal newlines" aktivieren.
Darum kommst du mit `os.linesep` ja auch nicht weiter :) universal -> '\n'
lunar

@cofi: "universal newlines" ist nochmal was anderes als die unter Windows übliche Umwandlung von "\r\n" zu "\n", für die die C-Standardbibliothek unter Windows verantwortlich ist und die nicht nur Python betrifft.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das stimmt schon, aber `universal newlines` macht das gleiche.
Es springt aber nur bei `rU` und `U` an. :oops:
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Universal Newlines habe ich so verstanden, dass es bei der Ausgabe schon platformabhängig ist.

Zumindest sagt der Docstring zu `io.open` unter Python 2.6:
newline controls how universal newlines works (it only applies to text
mode). It can be None, '', '\n', '\r', and '\r\n'. It works as
follows:

* On input, if newline is None, universal newlines mode is
enabled. Lines in the input can end in '\n', '\r', or '\r\n', and
these are translated into '\n' before being returned to the
caller. If it is '', universal newline mode is enabled, but line
endings are returned to the caller untranslated. If it has any of
the other legal values, input lines are only terminated by the given
string, and the line ending is returned to the caller untranslated.

* On output, if newline is None, any '\n' characters written are
translated to the system default line separator, os.linesep. If
newline is '', no translation takes place. If newline is any of the
other legal values, any '\n' characters written are translated to
the given string.
Ich hatte gedacht, dass dies auch das Verhalten für das Built-in `open` wäre. Getestet habe ich es unter Windows noch nicht. Und `newlines` steht bei `io.open` auf `None`. Aber gut, offenbar sind `io.open` und `open` etwas anderes, wenn man nach deiner Aussage geht.

Was mich aber dann verwundert:
The [mod]io[/mod] module provides the Python interfaces to stream handling. The built-in open() function is defined in this module.
BlackJack

@sttrader: Also Deine Erklärung für die ``while``-Schleife war irgendwie keine. Wenn man die Datei Zeilenweise liest um an die letzte ranzukommen, ist eine ``for``-Schleife einfacher.
Antworten