Zugriffsrechte von Verzeichnissen und Dateien ermitteln

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
jve
User
Beiträge: 6
Registriert: Montag 17. August 2020, 14:52

Hallo Zusammen,
Ich bin dabei ein Programm zu schreiben, welches die Anzahl und Namen von Verzeichnissen und Dateien ermittelt und ausgibt.
Das funktioniert auch alles :D Nun möchte ich jedoch die zugriffsrechte der Dateien und Verzeichnisse ermitteln. Dabei bin ich auf eine Hürde gestoßen im fogenden beispiel werden die Zugriffsrechte einer Datei geprüft wie kann ich aber meherer Dateien in einer liste auf einmal prüfen bzw. hintereinander

Code: Alles auswählen

import os
os.access('my_file', os.R_OK) # Check for read access
True
os.access('my_file', os.W_OK) # Check for write access
True
os.access('my_file', os.X_OK) # Check for execution access
False
os.access('my_file', os.F_OK) # Check for existance of file
True
ich habe so einen Ansatz klappt aber auch nicht:

Code: Alles auswählen

def access(path):
    list_d, list_f = name_dir_file(path)
    for i in range(len(list_f)):
        l_rechte = [os.access(list_f[i].split("\\")[-1], os.R_OK,)]
        return l_rechte
    """if os.access(list, os.W_OK):
        print("Schreibrechte bestehen.")
    else:
        print("Schreibrechte bestehen nicht.")"""
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Das return gehört nicht auf Ebene des Schleifenkörpers. Es gehört auf Ebene des Schlaifenkopfes, da return eine Schleife verlässt.
Der list* Präfix kann weg und du solltest keine Abhürzungen benutzen, also directories und files statt list_d und list_f.
Man iteriert in Python nicht mit Hilfe des Index über eine Liste, das ist ein Anti-Pattern. Man iteriert direkt über die Elemente der Liste.

Code: Alles auswählen

BUCHSTABEN = ["A","B","C","D","E"]

#also statt so:
for i in range(len(BUCHSTABEN)):
    print(BUCHSTABEN[i])

#besser so:
for buchstabe in BUCHSTABEN:
    print(buchstabe)

#edit: Tippfehler und Beispiel eingefügt.
Zuletzt geändert von Jankie am Donnerstag 20. August 2020, 10:54, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Was macht denn die Funktion name_dir_file? In neuen Programmen sollte man nicht mehr die low-level-Funktionen aus os benutzen, sondern pathlib.Path. Leider gibt es keinen direkten Ersatz für os.access.
Variablennamen sollten aussagekräftig sein, und keine Typen im Namen enthalten. Statt list_f wäre filenames besser, am Plural erkennt man schon, dass es mehrere Dateinamen sind, also irgendetwas Listartiges.
In Python iteriert man nicht über einen Index, wenn man direkt über die Elemente der Liste iterieren kann. Wenn Du die Rechte aller Dateien ermitteln willst, dann mußt Du sie in einer Liste sammeln, statt also eine Liste mit einem Element zu erzeugen, mußt Du ein Element anhängen. Das return muß dann auch nach der Schleife stehen. Dateinamen bearbeitet man nicht mit Stringfunktionen, und os.access braucht auch den gesamten Pfad und nicht nur den Dateiname.

Code: Alles auswählen

def access(path):
    directories, filenames = list_all_directories_and_filenames(path)
    read_rights = []
    for filename in filenames:
        read_rights.append(os.access(filename, os.R_OK))
    read_rights
Antworten