Seite 1 von 1

Schreibrechte im Ordner und auf Datei

Verfasst: Dienstag 13. Oktober 2009, 13:38
von würmchen
HI Leute,
ich suche nach einem brauchbaren Weg um zu testen ob ich eine Datei schreiben kann.

Dachte erst an ein os.system(touch file) aber bin mit der Lösung nicht ganz zufrieden.

Hab jetzt eben mit os.path.access() gespielt, damit kann ich aber nur auf eine existierende Datei testen, ob ich rechte drauf habe. Bei mir kann es aber sein das die Datei noch nicht existiert, oder das sie existiert und jemand anderem gehört, also ich keine Rechte drauf habe...

Kennt da jemand eine brauchbare Lösung?

Verfasst: Dienstag 13. Oktober 2009, 13:49
von Hyperion
Wieso nutzt Du nicht einfach Exceptions? Versuche eben zu schreiben / lesen und fange diese im Falle des Scheiterns ab. So kannst Du doch auch gezielt auf ein Scheitern reagieren.

Verfasst: Dienstag 13. Oktober 2009, 13:54
von derdon

Code: Alles auswählen

$ ls -l test
-r--r--r--  1 derdon  derdon     0B 12 Okt 15:32 test

Code: Alles auswählen

>>> from os import path
>>> path.exists('test')
True
>>> print path.exists.__doc__,
Test whether a path exists.  Returns False for broken symbolic links
>>> try:
...     open('test', 'w')
... except IOError:
...     print "Oh no! You don't have the permission to edit this file!"
... 
Oh no! You don't have the permission to edit this file!

Verfasst: Mittwoch 14. Oktober 2009, 08:30
von würmchen
@ Hyperion die Lösung war zu einfach, wie soll man denn da drauf kommen ;-)

Die Idee war super, hab das jetzt so gemacht wie auch derdon geschrieben hat. Sollte man da noch sicherheitshalber andere Exceptions abfangen, oder kann da nur ein IOError kommen?
Wollte das ganze möglichst "stabil" machen :-)

EDIT:
Ach und, bei der Fehlermeldung, gibt es da eine gewisse "beste" Syntax? Also zB irgendwie die Klasse und die Funktion noch mit ausgeben? Kann man das irgendwie automatisch machen, oder muss ich sowas händisch eintragen?

Verfasst: Mittwoch 14. Oktober 2009, 10:08
von Hyperion
würmchen hat geschrieben: Sollte man da noch sicherheitshalber andere Exceptions abfangen, oder kann da nur ein IOError kommen?
Wollte das ganze möglichst "stabil" machen :-)
Naja, ich würde es mal so sehen: Kommt eine andere Exception, wird sie ja an Dich / den User weitergereicht. Dann siehst Du immerhin, dass da evtl. noch etwas anderes behandelt werden muss - und kannst dann an Deinem Script nachbessern ;-)

Verfasst: Mittwoch 14. Oktober 2009, 10:14
von würmchen
Ok, so wird es jetzt zwangsweise laufen :-)

Ich bin vorhin auf der Suche noch auf diese PEP 341 gestoßen
http://www.python.org/dev/peps/pep-0341/

Allerdings verstehe ich nicht ganz, welches von diesen jetzt das empfohlene und kompatible sein soll.

Code: Alles auswählen

        try:
            <suite 1>
        except Ex1:
            <suite 2>
        <more except: clauses>
        else:
            <suite 3>
        finally:
            <suite 4>
Hört sich für mich jetzt logisch an...

Allerdings passt das mit der Aussage unten nicht ganz überein, oder versteh ich da was falsch?

Code: Alles auswählen

    The grammar for the try statement, which is currently

        try_stmt: ('try' ':' suite (except_clause ':' suite)+
                   ['else' ':' suite] | 'try' ':' suite 'finally' ':' suite)

    would have to become

        try_stmt: 'try' ':' suite
                  (
                    (except_clause ':' suite)+
                    ['else' ':' suite]
                    ['finally' ':' suite]
                  |
                    'finally' ':' suite
                  )
Kann mir das jemand noch mal erklären? :-)

Verfasst: Mittwoch 14. Oktober 2009, 11:37
von Hyperion
Also ich sehe nicht, wo es nicht zusammen passen würde?

Das finally kann man sich beim simplen Öffnen von Files oftmals durch Verwendung des with-Statements sparen.

Verfasst: Mittwoch 14. Oktober 2009, 16:57
von würmchen
Irgendwie irritiert mich das zweite finally innerhalb des ersten try blocks...

Aber wenn ich alles so benutze wie

Code: Alles auswählen

        try:
            <suite 1>
        except Ex1:
            <suite 2>
        <more except: clauses>
        else:
            <suite 3>
        finally:
            <suite 4>
sollte das denke ich dann ok sein...

Vielen Dank für eure Hilfe...