Seite 1 von 1

TXT Datei bewachen

Verfasst: Donnerstag 12. August 2010, 13:39
von sttrader
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

Re: TXT Datei bewachen

Verfasst: Donnerstag 12. August 2010, 13:50
von Hyperion
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!

Re: TXT Datei bewachen

Verfasst: Donnerstag 12. August 2010, 13:56
von sttrader
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

Re: TXT Datei bewachen

Verfasst: Donnerstag 12. August 2010, 14:00
von Hyperion
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.

Re: TXT Datei bewachen

Verfasst: Donnerstag 12. August 2010, 14:14
von cofi
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

Re: TXT Datei bewachen

Verfasst: Donnerstag 12. August 2010, 14:19
von Hyperion
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.

Re: TXT Datei bewachen

Verfasst: Donnerstag 12. August 2010, 14:23
von sttrader
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 :)

Re: TXT Datei bewachen

Verfasst: Freitag 13. August 2010, 07:34
von lutz.horn
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

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 16:16
von sttrader
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

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 16:27
von lutz.horn
Wozu StringIO? Lies doch direkt vom fobj.

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 16:29
von Hyperion
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.

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 16:32
von lutz.horn
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.

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 16:49
von sttrader
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

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 16:55
von lutz.horn
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.

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 17:04
von sttrader
Hallo lutz.horn

In deinem bsb wirt last_line ebenfalls nicht ausgegeben??

LG ST

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 17:08
von lutz.horn
Ist das eine Frage oder eine Feststellung? Bei mir (Python 2.6) funktioniert mein obiges Beispiel einwandfrei.

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 17:09
von sttrader
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

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 17:12
von 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.

Re: TXT Datei bewachen

Verfasst: Samstag 14. August 2010, 17:17
von sttrader
Danke für den Hinweis werde dies in Zukunft besser beachten.