Zeitgleiches lesen und schreiben in eine txt datei

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
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

Hallo Leute,

ich hab folgendes Problem. Ich erhalte von einem Sensor Daten, die auf meinem PC jede sekunde in eine TXT_File1 Datei geschrieben werden. Diese Messwerte lese ich ueber eine while schleife jede Sekunde in mein Python Programm ein, lass die durch einen von mir geschriebenen Algorithmus laufen und schreib das Ergebnis wiederum jede Sekunde in eine neue TXT_File2 Datei. Aus dieser TXT_File2 Datei liest nun wiederum ein weiterer Algorithmus die Ergebnisse und visualisiert diese auf meinem Bildschirm.

SensorProgram -> TXT_File1 -> PythonCode -> TXT_File2 -> Visualisierung

Das SensorProgram schreibt hierbei in die TXT_File1 und mein Python Program liest nur aus dem TXT_File1. Das funktioniert auch reibungslos. Problematisch wird es aber dann, wenn mein PythonCode in das TXT_File2 schreibt. Hier gibt es immer mal wieder Konflikte und das PythonProgram schmiert mir ab. Das Program fuer die Visualisierung laeuft aber weiterhin. Mein Code schaut so aus:

Code: Alles auswählen

    def WriteFile(self, DataEstimatorFile, WriteData):
        WriteString = strftime("%Y-%m-%d %H:%M:%S", localtime())
        for i in WriteData:
            WriteString = WriteString + " , " + str(i)
        WriteFile = file(DataEstimatorFile, "w+")
        WriteFile.write(WriteString)
        WriteFile.close()
Der Fehler ist:

Code: Alles auswählen

IOError: [Errno 13] Permission denied: 'c:\\Data.txt'
Fuer DataEstimatorFile erhaelt die Funktion "c:\Data.txt" und fuer WriteData einen String in dem meine Ergebnisse stehen. Im Visualisierungsprogram, welches aus TXT_File2 liest, ist auch angegeben, dass ein weiteres Program lese und schreibzugriff hat.

Weiss jemand was ich vielleicht falsch mache bzw. wo das Problem liegt?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Pretender2k hat geschrieben:

Code: Alles auswählen

    def WriteFile(self, DataEstimatorFile, WriteData):
        WriteString = strftime("%Y-%m-%d %H:%M:%S", localtime())
        for i in WriteData:
            WriteString = WriteString + " , " + str(i)
        WriteFile = file(DataEstimatorFile, "w+")
        WriteFile.write(WriteString)
        WriteFile.close()
Zwei ungute Sachen fallen mir auf:
[*] WriteFile ist der Name der Funktion, du weist allerdings den Rückgabewert von file() einem gleichnamigen Bezeichner zu.
[*] Statt file() sollte man open() zum Öffnen verwenden.

Kann es sein, dass das Programm mehrfach zur gleichen Zeit läuft?
BlackJack

@Pretender2k: Es könnte auch sein, dass das Visualisierungsprogramm genau in dem Moment auf die Datei zugeift. Oder ein Virenscanner. Oder ein Indexierungsprogramm was sich den Inhalt der Textdatei anschaut.

Ich würde die Datei nicht immer wieder neu öffnen, sondern nur einmal. Und dann nach dem `write()` ein `flush()`, damit die Daten auch wirklich sofort geschrieben werden.
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

Was ist denn der Vorteil wenn ich die Datei nur einmal Oeffne? Also prinzipiell, kannn es denke ich schon vorkommen, das beide Programme mal zum gleichen Zeitpunkt auf die Datei zugreifen wollen. Gbits da irgendwie ne moeglichkeit, dass dann eines Wartet bis man wieder auf die Datei zugreifen kann?
BlackJack

@Pretender2k: Der Vorteil ist, dass Du die Nachteile nicht hast. Die Ausnahme die Du Da bekommst zum Beispiel.
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

Wenn ich die Datei also einmal nur oeffne und die anderen Programme da fleissig draus lesen stoert mich das in python weniger, als wenn ich die datei mit python oeffne den Inhalt aendere und wieder schliesse? Hab ich das richtig verstanden?

EDIT: Hab das gerade mal getestet und es folgt das naechste Problem. Wenn ich die Datei nur einmal oeffne hab ich keine ahnung wie ich immer in die erste Zeile schreibe. Momentan wird bei jedem schreibvorgang die Infos hinten drangehaengt. Das moechte ich aber nicht. Die Ausgangswerte sollten immer nur in einer Zeile stehen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du kannst mit ``fileobjekt.seek(0)`` an den Anfang der Datei springen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Dann darf man aber nicht vergessen eventuelle Reste einer längeren, älteren Zeile mit def `truncate()`-Methode zu entfernen, oder das vor dem schreiben zu tun. Allerdings erscheint mir das alles ein wenig zerbrechlich. Was ist denn wenn das Visualisierungprogramm gerade dann liest, wenn Du am schreiben bist. Das sind ja alles keine garantierten atomaren Operationen.
Pretender2k
User
Beiträge: 27
Registriert: Freitag 23. Januar 2009, 18:23

Also insgesmat ist das natuerlich nicht die beste Loesung was ich da betreibe, aber ist es vielleicht moeglich einfach die Fehlermeldung zu ignorieren und den Lesevorgang erneut zu starten oder default werte zurueckzugeben? Insgesamt tritt der Fehler naemlich sehr sehr selten auf!
BlackJack

@Pretender2k: Das ist ja eine ganz normale Ausnahme bei der man natürlich auch mit der ganz normalen Ausnahmebehandlung arbeiten kann.
Antworten