Ich möchte den Inhalt einer versteckten Datei ersetzen und habe versucht, sie im w
-Modus zu öffnen, damit sie gelöscht/abgeschnitten wird:
>>> import os
>>> ini_path = '.picasa.ini'
>>> os.path.exists(ini_path)
True
>>> os.access(ini_path, os.W_OK)
True
>>> ini_handle = open(ini_path, 'w')
Dies führte jedoch zu einem Traceback:
IOError: [Errno 13] Permission denied: '.picasa.ini'
Das angestrebte Ergebnis konnte ich jedoch mit r+
Modus:
>>> ini_handle = open(ini_path, 'r+')
>>> ini_handle.truncate()
>>> ini_handle.write(ini_new)
>>> ini_handle.close()
Q. Was ist der Unterschied zwischen w
und r+
Modi, so dass einer "Erlaubnis verweigert" hat, aber der andere gut funktioniert?
PDATE: Ich bin auf win7 x64 mit Python 2.6.6, und für die Zieldatei wurde ein verstecktes Attribut festgelegt. Als ich versuchte, das versteckte Attribut auszuschalten, wurde w
-Modus ist erfolgreich, aber wenn ich ihn wieder einschalte, schlägt er erneut fehl.
F. Warum schlägt der w
-Modus bei versteckten Dateien fehl? Ist dieses Verhalten bekannt?
So funktioniert die Win32-API. Unter der Haube ruft Pythons Funktion open
die Funktion CreateFile
auf. Wenn dies fehlschlägt, übersetzt sie den Windows-Fehlercode in ein Python. IOError
.
Der Öffnungsmodus r+
Entspricht einem dwAccessMode
von GENERIC_READ|GENERIC_WRITE
Und einem dwCreationDisposition
von OPEN_EXISTING
. Der Öffnungsmodus w
entspricht einem dwAccessMode
von GENERIC_WRITE
Und einem dwCreationDisposition
von CREATE_ALWAYS
.
Wenn Sie die Anmerkungen in der Dokumentation CreateFile
sorgfältig lesen, heißt es:
Wenn
CREATE_ALWAYS
UndFILE_ATTRIBUTE_NORMAL
Angegeben sind, schlägtCreateFile
fehl und setzt den letzten Fehler aufERROR_ACCESS_DENIED
, Wenn die Datei vorhanden ist und den ZusatzFILE_ATTRIBUTE_HIDDEN
Oder enthält AttributFILE_ATTRIBUTE_SYSTEM
. Geben Sie dieselben Attribute wie die vorhandene Datei an, um den Fehler zu vermeiden.
Wenn Sie also CreateFile
direkt aus C-Code aufrufen, besteht die Lösung darin, FILE_ATTRIBUTE_HIDDEN
Zum Parameter dwFlagsAndAttributes
hinzuzufügen (anstatt nur FILE_ATTRIBUTE_NORMAL
). Da es jedoch in der Python-API keine Option gibt, die es veranlasst, dieses Flag zu übergeben, müssen Sie es nur umgehen, indem Sie entweder einen anderen Öffnungsmodus verwenden oder die Datei nicht mehr verbergen.
Hier sind die detaillierten Unterschiede: -
`` r '' Textdatei zum Lesen öffnen. Der Stream befindet sich am Anfang der Datei.
`` r + '' Zum Lesen und Schreiben öffnen. Der Stream befindet sich am Anfang der Datei.
`` w '' Datei auf Null Länge kürzen oder Textdatei zum Schreiben erstellen. Der Stream befindet sich am Anfang der Datei.
`` w + '' Zum Lesen und Schreiben öffnen. Die Datei wird erstellt, wenn sie nicht vorhanden ist, andernfalls wird sie abgeschnitten. Der Stream befindet sich am Anfang der Datei.
Zum Schreiben öffnen. Die Datei wird erstellt, wenn sie nicht vorhanden ist. Der Stream befindet sich am Ende der Datei. Nachfolgende Schreibvorgänge in die Datei enden immer am jeweils aktuellen Ende der Datei, unabhängig von einem dazwischen liegenden Suchvorgang (3) oder ähnlichem.
`` a + '' Zum Lesen und Schreiben öffnen. Die Datei wird erstellt, wenn sie nicht vorhanden ist. Der Stream befindet sich am Ende der Datei. Nachfolgende Schreibvorgänge in die Datei enden immer am aktuellen Ende der Datei, unabhängig von einem dazwischenliegenden Suchvorgang (3) oder ähnlichem.
Aus python documentation - http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files:-
Unter Windows wird die Datei im Binärmodus durch Anhängen von "b" geöffnet. Daher gibt es auch Modi wie "rb", "wb" und "r + b". Python unter Windows unterscheidet zwischen Text- und Binärdateien; die Zeilenendezeichen in Textdateien werden automatisch geringfügig geändert, wenn Daten gelesen oder geschrieben werden. Dies ändert sich hinter den Kulissen zu Dateidaten sind in Ordnung für ASCII Textdateien, aber sie beschädigen Binärdaten wie die in JPEG- oder EXE-Dateien. Achten Sie darauf, den Binärmodus beim Lesen und Schreiben solcher Dateien zu verwenden. Unter Unix Es tut nicht weh, ein 'b' an den Modus anzuhängen, sodass Sie es plattformunabhängig für alle Binärdateien verwenden können.
Wenn Sie also den w
-Modus verwenden, versuchen Sie tatsächlich, eine Datei zu erstellen, und verfügen möglicherweise nicht über die entsprechenden Berechtigungen. r+
ist die richtige Wahl.
Wenn Sie in einer Situation sind, in der Sie noch nicht wissen, wo Ihr .picasi.ini
existiert oder nicht und Ihr Windows-Benutzer hat Dateierstellungsberechtigungen in diesem Verzeichnis und Sie möchten neue Informationen anhängen, anstatt am Anfang der Datei zu beginnen (a.k.a "anhängen"), dann a+
wird die geeignete Wahl sein.
Es hat nichts damit zu tun, ob Ihre Datei versteckt ist oder nicht.