Seite 1 von 1

Letzte Zeile einer Text Datei Lesen

Verfasst: Samstag 20. Februar 2010, 04:08
von sttrader
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

Verfasst: Samstag 20. Februar 2010, 08:59
von querdenker
files.readlines() und slicing sind deine Freunde.

Verfasst: Samstag 20. Februar 2010, 09:51
von 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.

Verfasst: Samstag 20. Februar 2010, 10:50
von snafu
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

Verfasst: Samstag 20. Februar 2010, 11:05
von Trundle
@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.

Verfasst: Samstag 20. Februar 2010, 11:15
von snafu
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

Verfasst: Samstag 20. Februar 2010, 11:48
von querdenker
@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.

Verfasst: Samstag 20. Februar 2010, 11:58
von sttrader
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

Verfasst: Samstag 20. Februar 2010, 12:27
von cofi
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'

Verfasst: Samstag 20. Februar 2010, 12:54
von 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.

Verfasst: Samstag 20. Februar 2010, 13:38
von cofi
Das stimmt schon, aber `universal newlines` macht das gleiche.
Es springt aber nur bei `rU` und `U` an. :oops:

Verfasst: Samstag 20. Februar 2010, 14:57
von snafu
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.

Verfasst: Samstag 20. Februar 2010, 22:27
von 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.