Hallo
Ich habe mal eine kleine Frage an euch. Ich habe ein Programm das ständig (ein par mal in der Minute) in ein txt File schreibt und Python Programm das dieses File Ständig ausliest nun kommt es aber vor das sich beide Programme hin und wider im weg stehen und das Lesende Programm abbricht. Wie kann ich sicher stellen das das txt File gerade nicht durch ein anderes Programm genutzt wird und erst dann auslesen????
Über vorschläge wäre ich euch sehr Dankbar.
LG
Gemeinsammer Dateizugriff
Ich Benutze Linux.
LG
LG
Danke für die Tips mal sehen ob etwas davon klappt ich habe ja das Problem das ich keinen einfluss auf das Schreibende Programm habe, nur auf das Lesende Programm.
LG
LG
Benenne vor dem Lesen die Datei um. Es ist unter Unix garantiert, dass os.rename() eine atomare Operation ist. Dann kann dir das andere Programm nicht in die Datei schreiben, während du sie noch ausliest.
Stefan
Stefan
@sma: Wenn das andere Programm die Datei offen hat und gerade schreibt, hilft umbenennen nicht, denn auch durch das Umbenennen bleibt es ja die gleiche Datei, auf die dann beide Programme gleichzeitig zugreifen. Man hat in dem Fall immer noch die Situation dass Programm A in die Datei schreibt und Programm B gleichzeitig die nicht vollständige Datei versucht zu verarbeiten.
Ausserdem ist der OP IMHO nicht ganz klar in der Aussage ob Programm A die Datei immer neu erstellt oder ob es sich um eine Art Protokolldatei handelt bei der immer nur neue Daten dazu geschrieben werden. Dann würde man mit Umbenennen A entweder das Protokoll wegnehmen wenn es die Datei immer neu öffnet, oder aber rein gar nichts erreichen wenn A die Datei ständig offen hält.
Ausserdem ist der OP IMHO nicht ganz klar in der Aussage ob Programm A die Datei immer neu erstellt oder ob es sich um eine Art Protokolldatei handelt bei der immer nur neue Daten dazu geschrieben werden. Dann würde man mit Umbenennen A entweder das Protokoll wegnehmen wenn es die Datei immer neu öffnet, oder aber rein gar nichts erreichen wenn A die Datei ständig offen hält.
Du hast Recht, das klingt eher nach Log-Datei. Da ist es natürlich schwierig, sauber zu lesen, wenn das schreibende Programm nicht sauber, d.h. mit nur einem os.write() Syscall-Äquivalent jeden Eintrag schreibt (denn auch diese sind in Unix atomar).
Stefan
Stefan
Hallo
Das Programm das die Datei schreibt schreibt Praktisch immer nur eine Zeile und zwar Realtime Börsen Kurse, bei jedem Neuen Kurs wird die Datei überschrieben. Die Datei sieht dann z.b so aus.
Mit Python Lese ich die Datei aus um z.b ein Handelssystem mit Realtime Kurse zu versorgen. Wenn aber das schreibende Programm gerade schreibt wärend ich Lesen möchte knallt es den Fehler index ist out of Range raus und bricht ab.
Das ist der versuchs Code dazu
Jetzt hab ich es gerade so versucht das ich das File Einlese und es danach Lösche ,und erst dann erneut Einlese wenn das File wider Existiert. Aber das ist bestimmt nicht die Lösung denke ich.
LG
Das Programm das die Datei schreibt schreibt Praktisch immer nur eine Zeile und zwar Realtime Börsen Kurse, bei jedem Neuen Kurs wird die Datei überschrieben. Die Datei sieht dann z.b so aus.
Code: Alles auswählen
1.4034;1.4036
Das ist der versuchs Code dazu
Code: Alles auswählen
def TestQwote():
a = 0
b = 1
Bid = 0
Ask = 0
lock = "a"
while a != b:
if os.path.exists(FileName):
reader = csv.reader(open(FileName, "rb"), delimiter=";")
for row in reader:
Bid = float(row[0])
Ask = float(row[1])
print Ask
os.remove(FileName)
TestQwote()
LG
Zuletzt geändert von sttrader am Donnerstag 31. Mai 2012, 14:36, insgesamt 1-mal geändert.
Wenn die Datei vom Schreiber immer wieder neu angelegt wird, hast Du das Problem, dass die Datei vom Anlegen bis zum Beschreiben leer ist. Da das zwei atomare Vorgänge sind, kann es passieren, dass der lesende Prozess eine leere Datei vorfindet. Werden die CSV-Reihen nun auch noch separat in die Datei geschrieben, wird es schwierig, den richtigen Moment auf Leseseite abzupassen, wenn gerade die Datei fertig geschrieben ist.
Das leer-Problem kannst Du umgehen, in dem Du die Datei öffnest und in einem Rutsch mit os.read() einliest:Die 4096 müsstest Du so anpassen, dass tatsächlich die ganze Datei komplett gelesen wird. Ist `bytes` leer, war die Datei zum Zeitpunkt des Lesens auch leer. Also wiederholst Du den Leseversuch.
Für das Problem der CSV-Reihen hab ich keine probate Lösung. Was hier evtl. helfen würde, wäre das Wissen um die Anzahl der Einträge, die der Schreiber ausgibt. Dann könntest Du prüfen, ob `bytes` diese auch alle enthält, wenn nicht, hast Du wohl nur einen Teil der Daten vorgefunden und musst entsprechend den Lesevorgang wiederholen.
Edit:
Ein häppchenweises Beschreiben schreit eigentlich nach einem Write-Lock, da Du aber keinen Zugriff auf den Schreiber hast, scheidet das wohl aus.
Das leer-Problem kannst Du umgehen, in dem Du die Datei öffnest und in einem Rutsch mit os.read() einliest:
Code: Alles auswählen
with open('datei') as f:
bytes = os.read(f.fileno(), 4096)
Für das Problem der CSV-Reihen hab ich keine probate Lösung. Was hier evtl. helfen würde, wäre das Wissen um die Anzahl der Einträge, die der Schreiber ausgibt. Dann könntest Du prüfen, ob `bytes` diese auch alle enthält, wenn nicht, hast Du wohl nur einen Teil der Daten vorgefunden und musst entsprechend den Lesevorgang wiederholen.
Edit:
Ein häppchenweises Beschreiben schreit eigentlich nach einem Write-Lock, da Du aber keinen Zugriff auf den Schreiber hast, scheidet das wohl aus.
Hallo
Ich habe das Programm oben von mir seit 2-3 Stunden am Laufen bis her gab es keine weiteren abstürze mehr mal sehen ob es so bleibt.
LG
Ich habe das Programm oben von mir seit 2-3 Stunden am Laufen bis her gab es keine weiteren abstürze mehr mal sehen ob es so bleibt.
LG