TXT Datei bewachen

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 Freunde

Ich habe eine Frage, wie bekomme ich es hin in einer TXT Datei immer
in einer While schleife immer nur die Letze Zeile einzulesen.
Ich habe dazu einfach keine Lösung gefunden, ich würde mich sehr über
einen kleinen Sampel Code freuen.

LG ST
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

sttrader hat geschrieben: Ich habe eine Frage, wie bekomme ich es hin in einer TXT Datei immer
in einer While schleife immer nur die Letze Zeile einzulesen.
Kapiere ich nicht! Wozu ne Schleife, wenn Du nur die letzte Zeile willst? Gib doch mal ein minimales Beispiel mit einer Textdatei und was in der Schleife damit passieren soll!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Also es geht darum das ich Handelssysteme habe in der Signale in einer
.txt Datei gespeichert werden das sieht dann so aus.

Code: Alles auswählen

08/06/2010    11:20:00       463          Sell           6339,91      -1 
08/06/2010    12:05:00       472          Exitshort      6346,35       0            -6,44 

08/12/2010    10:35:00       982          Sell           6140,79      -1 
08/12/2010    12:05:00       1000         Exitshort      6131,28       0             9,51 

Ich muss also wenn es änderungen in der Letzten zeile gibt diese einlesen
verarbeiten um z.b Orders zu senden was auch kein Problem ist.

Eben nur die Letzte Zeile auf änderungen zu Prüfen bekomme ich nicht hin.

LG ST
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ach so. Also das könntest Du so realisieren:

Code: Alles auswählen

In [41]: from StringIO import StringIO

In [42]: data = """
   ....: 08/06/2010    11:20:00       463          Sell           6339,91      -
1
   ....: 08/06/2010    12:05:00       472          Exitshort      6346,35
0            -6,44
   ....:
   ....: 08/12/2010    10:35:00       982          Sell           6140,79      -
1
   ....: 08/12/2010    12:05:00       1000         Exitshort      6131,28
0             9,51
   ....: """

In [43]: f = StringIO(data)

In [44]: last_line = f.readlines()[-1]

In [45]: print last_line
-------> print(last_line)
08/12/2010    12:05:00       1000         Exitshort      6131,28       0
     9,51
Das StringIO-Objekt namens "f" repräsentiert hier Deine Datei, die Du eigentlich mit "with open(filename, "r") as irgend_was:" laden würdest.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich denke der OP will einfach die letzte Zeile präsentiert haben, aber nur wenn sich etwas aendert.
Unter Linux wäre z.b. inotify eine Loesung: http://trac.dbzteam.org/pyinotify
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ist natürlich schöner als periodisches "Abtasten", da hast Du recht.

Ich hatte da eben nur diesen "primitiven" Ansatz erkannt; wobei er sich ja die jeweils aktuelle merken kann und mit der vermeindlich neuen abgleichen könnte. Dazu eine Schleife, die eben alle x Sekunden das File läd und man hätte auch eine, wenn auch schlechtere, Lösung.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Danke euch für eure gedanken dazu :)

Das Problem ist das die Software schon einen recht grossen umfang hat
und ich versuche so wenig wie möglich fremde Add onś zu nutzen
wegen der Wartbarkeit insofern war ich schon zu frieden als Tix zum
Standart wurde :)
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Falls ich Dich richtig verstehe, suchst Du nach einem Äquivalent zu tail. Das gibt es hier: http://pypi.python.org/pypi/tailer/0.2.1

Code: Alles auswählen

import tailer

for line in tailer.follow(open('test.txt')):
    print line
https://www.xing.com/go/invite/18513630.6a91d4
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Hallo Hyperion

Was mache ich hier Falsch es wird nie der inhalt ausgeben sondern immer:

<open File " test.txt ", mode "r" at 0x1f0c9c0>

Code: Alles auswählen

import string
from StringIO import StringIO
import time 


def OrderRead():
    fobj = open("test.txt","r") 
    data = StringIO(fobj)
    last_line = data.readlines()[-1]
    print last_line
    #print(last_line)
    fobj.close()
    Start()

def Start():
    time.sleep(10)
    OrderRead()


Start()    



LG ST
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Wozu StringIO? Lies doch direkt vom fobj.
https://www.xing.com/go/invite/18513630.6a91d4
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie ich schon mal schrieb:
Hyperion hat geschrieben: Das StringIO-Objekt namens "f" repräsentiert hier Deine Datei, die Du eigentlich mit "with open(filename, "r") as irgend_was:" laden würdest.
Ok, besser wäre ein "File like object" gewesen. StringIO habe ich doch nur genommen, weil ich keine Datei extra für die Demonstration anlegen wollte. So ein Objekt simuliert nur genau das, was Du so auch bekommen würdest:

Code: Alles auswählen

infile = open("filename", "r")
Allerdings solltest Du Dateien immer mit with öffnen.

Code: Alles auswählen

with open("filename", "r") as infile:
    # hier ist infile nun verfügbar
Denn dabei wird die datei auf jeden Fall geschlossen - man braucht sich darum nicht mehr selber kümmern.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Laut http://docs.python.org/library/stringio ... O.StringIO ist das Argument für diese Methode ein String und kein File-like-Object. Das kann deswegen so nicht klappen.

Die Verwendung von with ist auf alle Fälle sinnvoll.
https://www.xing.com/go/invite/18513630.6a91d4
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Nun habe ich es geändert aber print last_line gibt nichts aus ????

Code: Alles auswählen

import string
import time 


def OrderRead():
    infile = open("test.txt", "r")
    with open("test.txt", "r") as infile:
        last_line = infile.readlines()[-1]
        print "ich bin in der def "
        print last_line
        #infile.close()
        Start()

def Start():
    time.sleep(1)
    OrderRead()


Start()    

LG ST
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Probier es mal so:

Code: Alles auswählen

import time

if __name__ == "__main__":
    while True:
        time.sleep(1)
        with open("test.txt") as infile:
            last_line = infile.readlines()[-1]
            print last_line,
Edit: import string entfernt.
https://www.xing.com/go/invite/18513630.6a91d4
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Hallo lutz.horn

In deinem bsb wirt last_line ebenfalls nicht ausgegeben??

LG ST
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Ist das eine Frage oder eine Feststellung? Bei mir (Python 2.6) funktioniert mein obiges Beispiel einwandfrei.
https://www.xing.com/go/invite/18513630.6a91d4
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Alles klar der fehler lag in der TXT datei er hat die Letzte Zeile ausgegeben
die war aber ohne jeglichen inhalt :lol:

Ich danke euch allen für eure Hilfe wirklich ein sehr Nettes Forum :D
BlackJack

@sttrader: Funktionsaufrufe sollte man nicht als unbedingte "Sprungbefehle" missbrauchen. Nach spätestens 500 Sekunden dürfte Dein Programm auf einem normalen CPython mit einer Fehlermeldung aussteigen, dass das Rekursionslimit erreicht ist. Schreib Funktionen so, dass sie auch zurückkehren und benutze für Schleifen die dafür vorgesehenen Schleifenkonstrukte.
sttrader
User
Beiträge: 53
Registriert: Dienstag 12. Januar 2010, 11:22
Kontaktdaten:

Danke für den Hinweis werde dies in Zukunft besser beachten.
Antworten