Textdatei neu einlesen

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
Vondor
User
Beiträge: 11
Registriert: Mittwoch 11. November 2009, 17:27

Moin,
Ich hab um etwas Übung zu bekommen ein kleines Programm geschrieben das eine .log datei kontrollieren soll.

Dabei handelt es sich um eine Textdatei die von einem Transfer Programm angelegt und ständig erneuert wird.


Nun soll mein kleines Programm alle 5min diese Datei neu einlesen und Kontrollieren was in der letzten Zeile steht. Sofern da *erfolgreich* steht soll es nach 5min nochmal versuchen.


Nun ist es so das die Kontrolle wunderbar Funktioniert.
Jedoch wird die Textdatei nicht jedesmal aufs neue eingelesen.
Und so bringts mir nicht viel.

Hab schon viel mit f.close() rumexperimentiert. Aber ohne den gewünschten Effekt.

Hat jemand ne Idee?

Hier noch ein Auszug aus dem Programm:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import time
# Importiert System Informationen

f = open('/home/***/transfer.log', 'r')
# Defenieren der Log-Datei

list = f.readlines()
# Lesen der Liste

verg1 = list[-1]
verg2 = list[-2]
verg3 = list[-3]
verg4 = list[-4]
# Durchsuchen der Liste der Jeweiligen Zeile

beendet = True
# Wartet auf ein Beenden Signal im Log


while beendet:

	if verg1.find('erfolgreich') != -1:
		print "Transfer wird fortgesetzt."
                f.close()
		time.sleep(300)

	elif verg1.find('ERROR') != -1:
		print "Tranfser Fehlgeschlagen. Bitte Neustarten!"

(weiter gehts mit weiteren Elif einträgen...)
Gruß, Vondor

EDIT: Code-Tags verwendet^^
Zuletzt geändert von Vondor am Mittwoch 11. November 2009, 18:39, insgesamt 1-mal geändert.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Du musst die Datei natürlich auch neu öffnen und lesen...

P.S. Für Python gibt es spezielle Code-Tags!

Edit: Noch was zu deinem Code.
``list`` sollte man nicht überschreiben, das ist ein builtin.
Außerdem kann man mit

Code: Alles auswählen

for line in fileobject:
    ...
über eine geöffnete Datei zeilenweise iterieren.
Vondor
User
Beiträge: 11
Registriert: Mittwoch 11. November 2009, 17:27

Okay^^ Hab die Code-Tags verwendet. Muss dazu sagen das ich den Beitrag 5min bevor ich ausm Zug austeigen bin, geschrieben hab... Demnach hatte ichs wohl übersehen. Sorry^^

Naja, jedenfalls. Ordentlich kürzen kann ich es immer noch. Muss mich mal mit "for" in dieser Verwendung auseinandersetzen.

(Übrigens die Kommentare hinter # hatte ich nur für mich geschrieben gehabt damit ich verstehe was ich da tu)




Aber das die Datei neu geöffnet werden muss und dann wieder gelesen werden muss ist ja klar.
Jedoch dachte ich das bei:

Code: Alles auswählen

if verg1.find('erfolgreich') != -1:
        print "Transfer wird fortgesetzt."
                f.close()
f die datei geöffnet wird und demnach bei f.close, also am ende, sie wieder geschlossen wird.
Also war es nach meinem verständniss so das er die Datei neu einlesen muss, da sie ja geschlossen wurde. Was er aber nicht tut und ich somit nicht verstehe.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das ganze sieht eh sehr labil aus...

Dateien öffnet man seit Python 2.5 mit "with", dazu verwende ich immer noch ein try...except und fange dort einen IOError ab.

ein fileobject.close() schließt eine Datei. Wenn ich diese neu öffnen will, muss ich das auch tun. Das kann man aus Deinem Code so nicht sehen, denn da wird nur 1x eine Datei geöffnet.

verg1, verg2, ... ist auch häßlich - wieso nicht gleich die Indizies nutzen für den Zugriff?

Mein Vorschlag:

- schreibe eine Funktion, die diese Datei öffnet und die letzten x-Zeilen zurückliefert / oder ggf. auch alle Zeilen. In dieser Funktion implementierst Du ein sauberes (s. o.) Dateihandling!

- schreibe eine Funktion, die in eine Endlosschleife beherbergt:

Code: Alles auswählen

def foo():
    while True:
        pass
        # will man raus, nutze return / break
in dieser Schleife hole Dir den Dateiinhalt durch Aufruf der anderen Funktion und führe Deine Tests durch. Schlagen die fehl, kommst Du per return da raus, ansonsten am Ende der Funktion ein entsprechendes sleep().
Antworten