In eine Textdatei laufend schreiben

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.
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

In eine Textdatei laufend schreiben

Beitragvon 7crystal7 » Samstag 27. Januar 2007, 14:17

Hallo Leute,

ich möchte in ein Logfile schreiben, das einfach eine Textdatei sein soll.
Dabei möchte ich Zeile für Zeile anfügen, während des Zugriffs soll die Datei gelockt werden.
Wie mache ich sowas?

Danke
Babsi
cracki
User
Beiträge: 72
Registriert: Montag 25. Dezember 2006, 05:01

Beitragvon cracki » Samstag 27. Januar 2007, 14:29

machs einfach.
oeffnen, reinschreiben
...meh...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: In eine Textdatei laufend schreiben

Beitragvon gerold » Samstag 27. Januar 2007, 14:44

7crystal7 hat geschrieben:Dabei möchte ich Zeile für Zeile anfügen, während des Zugriffs soll die Datei gelockt werden.

Hi Babsi!

Unter Windows:

Code: Alles auswählen

f = file("J:/Ablage/xxx.txt", "a")
# Ab jetzt ist die Datei unter Windows automatisch gesperrt
f.close()
# jetzt nicht mehr.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

Beitragvon 7crystal7 » Samstag 27. Januar 2007, 14:48

danke, das ganze läuft unter Linux.

Wird die Datei da auch automatisch gesperrt?

DAnke
Babsi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 27. Januar 2007, 14:51

7crystal7 hat geschrieben:das ganze läuft unter Linux. Wird die Datei da auch automatisch gesperrt?

Hi Babsi!

Nein, aber dafür kannst du das Modul ``fcntl`` einsetzen.

http://docs.python.org/lib/module-fcntl.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

Beitragvon 7crystal7 » Samstag 27. Januar 2007, 14:56

danke, könntest Du mir ein kleines Codefragment hinschreiben bei dem das File dann gelockt wird während etwas angefügt wird.. Bin leider Newbie, das wäre sehr nett!

Danke
Babsi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 27. Januar 2007, 15:29

7crystal7 hat geschrieben:das wäre sehr nett!

Hallo Babsi!

Eigentlich sollte es -- meiner Meinung nach -- so funktionieren:

Code: Alles auswählen

>>> import fcntl
>>> f = file("hallo.txt", "a")
>>> fcntl.lockf(f.fileno(), fcntl.LOCK_EX)
>>> f.write("Hallo\n")
>>> fcntl.lockf(f.fileno(), fcntl.LOCK_UN)
>>> f.close()
>>>

Allerdings konnte ich bei meinem Test trotzdem mit ``echo "Hallo" >> testdatei.txt`` von einem anderen Terminal aus etwas in die Datei schreiben -- obwohl ich vorher die Datei gesperrt hatte. Vielleicht liegt es daran, dass ich in beiden Terminals als root angemeldet war. :K

Mit ``nano -w testdatei.txt`` konnte ich keine Änderung in die Textdatei schreiben.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

Beitragvon 7crystal7 » Samstag 27. Januar 2007, 15:41

alles klar, ich probier das aus!

Vielen Dank!
BlackJack

Beitragvon BlackJack » Samstag 27. Januar 2007, 16:40

gerold hat geschrieben:Allerdings konnte ich bei meinem Test trotzdem mit ``echo "Hallo" >> testdatei.txt`` von einem anderen Terminal aus etwas in die Datei schreiben -- obwohl ich vorher die Datei gesperrt hatte. Vielleicht liegt es daran, dass ich in beiden Terminals als root angemeldet war. :K


Die Locks sind nur freundliche Hinweise. Wenn eine Anwendung nicht fragt ob gelockt ist, dann bringts auch nichts.

Mit ``nano -w testdatei.txt`` konnte ich keine Änderung in die Textdatei schreiben.


`nano` ist dann wohl so freundlich zu fragen ob gelockt ist, bzw. lockt selbst.
7crystal7
User
Beiträge: 46
Registriert: Freitag 26. Mai 2006, 18:50

Beitragvon 7crystal7 » Samstag 27. Januar 2007, 17:00

hmm ok,

zumindest sollte aber so verhindert werden das über python gleichzeitig in das File geschrieben wird (threads oder so?)?

Danke
Babsi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 27. Januar 2007, 17:16

7crystal7 hat geschrieben:zumindest sollte aber so verhindert werden das über python gleichzeitig in das File geschrieben wird

Hi Babsi!

Du könntest z.B. Lockfiles dafür verwenden!

- Schau nach ob eine besondere Datei mit dem gleichen Dateinamen, aber der Endung ".lck" existiert. Prüfe nach, ob der Prozess oder Thread, der diese Datei erstellt hat noch läuft. Wenn ja --> warten. Wenn nicht --> alte Lockdatei löschen.
- Neue Lockdatei erstellen.
- Datei öffnen und in die Datei schreiben.
- Datei schließen.
- Lockdatei löschen.

PID und Namen des Threads kannst du in die Lockdatei schreiben.
Mit dem PID prüfst du, ob das Programm, das die Lockdatei erstellt hat, noch läuft.
Mit dem Threadnamen prüfst du, ob der benannte Thread noch läuft, falls es sich um das eigene Programm handelt.

mfg
Gerold
:-)

PS: ...oder du findest raus, wie du prüfen kannst, ob die Datei gesperrt ist. Ich bin da noch nicht sicher.
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 27. Januar 2007, 17:28

``os.access``
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Beitragvon BlackJack » Samstag 27. Januar 2007, 17:35

gerold hat geschrieben:Du könntest z.B. Lockfiles dafür verwenden!

- Schau nach ob eine besondere Datei mit dem gleichen Dateinamen, aber der Endung ".lck" existiert. Prüfe nach, ob der Prozess oder Thread, der diese Datei erstellt hat noch läuft. Wenn ja --> warten. Wenn nicht --> alte Lockdatei löschen.
- Neue Lockdatei erstellen.
- Datei öffnen und in die Datei schreiben.
- Datei schließen.
- Lockdatei löschen.


Das funktioniert nicht zuverlässig. Prozess 1 kommt an und testet ob die Lockdatei vorhanden ist -> Nein. Prozesswechsel. Prozess 2 testet ob Lockdatei vorhanden ist -> Nein. Und schon schreiben beide in die Datei.

PS: ...oder du findest raus, wie du prüfen kannst, ob die Datei gesperrt ist. Ich bin da noch nicht sicher.


Na ganz einfach ein exlusives Lock anfordern. Das klappt natürlich nicht, wenn schon eines vergeben wurde und der Kernel garantiert das diese Aktion atomar ist.

Die `os.access()` "Lösung" hat genau das gleiche Problem, was ich oben für die Lockdatei beschrieben habe.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Samstag 27. Januar 2007, 17:40

BlackJack hat geschrieben:Na ganz einfach ein exlusives Lock anfordern.

Hi BlackJack!

Was habe ich mit dieser Codezeile gemacht?

Code: Alles auswählen

fcntl.lockf(f.fileno(), fcntl.LOCK_EX)

Gibt es eine andere Methode, eine Datei wirklich exclusiv zu sperren?

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Samstag 27. Januar 2007, 18:31

cracki hat geschrieben:machs einfach.
oeffnen, reinschreiben


-->

7crystal7 hat geschrieben:während des Zugriffs soll die Datei gelockt werden.

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]