Lister - Programmidee

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.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hallo,

bisheriger Quellcode:

Code: Alles auswählen

import os
import os.path

def show_directory(path):
    for entry in os.listdir(path):
        file2.write(os.path.join(path, entry))
        file2.write("\n")

liste = [r"C:\\", r"C:\\Users", r"C:\\Windows", r"C:\\Windows\\System32", r"C:\\Windows\\SysWOW64"]

with open("test.txt", "w") as file2:
    for path in liste:
        show_directory(path)
Nun möchte ich neben dem Auflisten von Dateien auch den MD5 Wert ermitteln. Dabei habe ich das Modul hashlib gefunden. Jedoch finde ich nur Beispiele, die aus einem String einen MD5-HashWert machen. Ist es möglich mit diesem Modul auch den MD5-HashWert zu ermitteln?

Und ich will auch sehr gerne das Erstellungsdatum und Änderungsdatum ermitteln. Ist das mit dem Modul time zu schaffen oder geht das über meine bisherigen Kenntisse?

Danke für jegliche Hilfe!
BlackJack

@Gary123456: Du musst halt die Datei als Binärdatei öffnen und dann einlesen und daraus die Prüfsumme bilden. Einlesen am besten in einer Schleife blockweise, denn bei einem einfachen `read()` bekommst Du Probleme wenn die Dateien gross werden. Bei DVD-Images zum Beispiel.

`os.path` muss man nicht explizit importieren. Das passiert schon wenn man das `os`-Modul importiert.

Was soll die `2` bei `file2`?

Funktionen sollten nicht auf Werte (ausser Konstanten) zugreifen, die nicht als Argumente übergeben wurden. Und das Hauprogramm sollte in einer Funktion stecken und nicht einfach auf Modulebene stehen. Dann kommt man auch weniger in Versuchung aus Funktionen auf irgendwelche global definierten, veränderbaren Objekte zuzugreifen.

`liste` ist ein schlechter Name. Warum muss ich hoffentlich nicht erklären, denn ich denke das habe ich schon mindestens einmal gemacht.

`show_directory()` ist auch schlecht, weil der Name nicht zu dem passt, was die Funktion macht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben: `show_directory()` ist auch schlecht, weil der Name nicht zu dem passt, was die Funktion macht.
Hehe... wenn man nur kopiert und nicht mitdenkt :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Gary123456 hat geschrieben:

Code: Alles auswählen

liste = [r"C:\\", r"C:\\Users", r"C:\\Windows", r"C:\\Windows\\System32", r"C:\\Windows\\SysWOW64"]
Raw Strings und doppelter Backslash? Ich bin ja erstaunt, dass das überhaupt funktioniert.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Danke bisher an alle. Dank euer Forum habe ich einen kleinen Quellcodeschnipsel gefunden: http://www.python-forum.de/viewtopic.php?f=11&t=6642

Sha Wert ist auch gut. Jetzt kommts zum MD5 Wert ;)
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Nun bin ich so weit:

Code: Alles auswählen

import os
import sha



def shasum(filepath, blocksize = 1024 * 1024):   
    h = sha.new()
    f = file(filepath, "rb")
    try:
        while True:
            part = f.read(blocksize)
            if not part:
                break
            h.update(part)
    finally:
        f.close()
   
    return h.hexdigest()

def textdatei_write():
    for entry in os.listdir(path):
        textdatei.write(os.path.join(path, entry))
        textdatei.write(" SHA ")
        textdatei.write(shasum(os.path.join(path, entry)))
        textdatei.write("\n")

Ordner_Liste = [r"C:\\"]


with open("test.txt", "w") as textdatei:
    for path in Ordner_Liste:
        try:
            textdatei_write()
        except IOError:
            textdatei.write("Keine Berechtigungen!")
Meine Frage ist, wie kann ich Dateien überspringen, die nicht zugreifbar sind?

##Letzter Code für heute##
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dateien sollte man mit dem folgenden Idiom öffnen:

Code: Alles auswählen

with open(...) as handler:
    # handler ist hier file-Objekt und muss nicht mehr explizit geschlossen werrden
Wieso tust Du das nicht überall im Code?

- ``textdatei_write()`` ist kein guter Name! Zum einen hast Du da Denglisch, zum anderen ist das zu allgemein. Du schreibst dort doch Prüfsummen zu Dateien, also benenne das doch auch entsprechend. ``write_checksum_infos()`` z.B. (Allerdings müsste es sogar korrekter lauten: ``get_directory_entries_and_calc_checksum_and_write_infos()``. Mehr dazu ganz am Schluss meines Beitrags!)

- Ich würde den Aufruf von ``textdatei.write`` auch minimieren. Baue doch separat erst einmal den String zusammen und schreibe dann die komplette Zeile weg.

- Ich würde den Code von Modul-Ebene wegbekommen. Ich vermute irgend wie, dass Dir das auch schon x Mal gezeigt und gesagt worden ist ;-) (Ach ich seh grad BlackJack hatte das schon genannt)

- Modul globale Objekte (``Ordner_List``) würde ich immer weit nach oben in der Datei stellen, also direkt unter die ``import``-Statements.

- Generell gefällt mir die Aufteilung nicht! Du fasst zu viel zusammen. Trenne doch besser das Auslesen eines Verzeichnisses vom Berechnen der Prüfsumme und dem Schreiben der Ergebnisse in eine Datei. Das macht das ganze besser wartbar und darüber hinaus auch flexibler. Du könntest dann leicht einen anderen Hash-Algorithmus wählen, die Ausgabe auf den Bildschirm oder in eine Datenbank lenken usw. Merke Dir die (Zwischen-)Ergebnisse einfach in einer passenden Datenstruktur (z.B. eine Liste von Tupeln o.ä.).
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ich habe jetzt vieles geändert, bzw. das meiste gelöscht, denn ich teste da viel rum, um da ein "Gespür" zu bekommen, wie das System tickt.

Nun gibt es die Methode chmod. Diese soll ja die Zugriffsrechte ändern. Meine Frage wäre dann, inwiefern ist das möglich? Kann man dann ein geschützte Datei dann "schreibbar" machen und somit manipulieren?
BlackJack

@Gary123456: Wenn Du die Rechte dazu hast die Rechte zu ändern. :-)
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Mal testen, eine Systemdatei schreibbar zu machen xD Wäre ja ziemlich krass. Danke!
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Letzte Frage für heute:

Nun will ich zum Beispiel die Rechte für diesen Ordner ändern: C:\\$Recycle.Bin

Schaue ich unter Eigenschaften unter Sicherheit, stelle ich fest, dass es drei verschiedene Benutzergruppen gibt: System, Administrator und Benutzer. Das ist sogar für mich ( :!: ) logisch :P

Nun wenn ich die Schreibrechte so ändern will:

Code: Alles auswählen

import os
os.chmod("C:\\$Recycle.Bin", 0o640)
frage ich mich dennoch, für welche Benutzergruppe es diese Rechte ändert? Und auch wenn ich diesen Code auführe, scheint es die Rechte nicht unter die Benutzergruppe "Benutzer" geändert zu haben. Nun - ändere ich manuell die Eigenschaften und versuche den alten Code auszuführen zeigt es immer noch an, dass er auf diesen Ordner keine Rechte hat.

Gibt es irgendeine Lektüre etc., die für mich geeignet ist? Mich interessieren halt solche Sachen ;)
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Gary123456 hat geschrieben:

Code: Alles auswählen

    f = file(filepath, "rb")
Wie kommst du eigentlich auf die merkwürdige Idee file zum Öffnen einer Datei zu nehmen. Schau doch bitte wenigstens ab und zu mal in die Dokumentation: "When opening a file, it’s preferable to use open() instead of invoking this constructor directly.".
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Das ist ein Codeschnipsel aus diesem Forum. Daher steht file auch da. Und da sehe ich keinen Anlass zu ändern, wenns funktioniert. Und das ist der alte Code:
Ich habe jetzt vieles geändert, bzw. das meiste gelöscht, denn ich teste da viel rum, um da ein "Gespür" zu bekommen, wie das System tickt.
BlackJack

@Gary123456: In der offiziellen Dokumentation steht das man das nicht machen sollte und das ist für Dich kein Anlass es zu ändern‽
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Gary123456 hat geschrieben:Gibt es irgendeine Lektüre etc., die für mich geeignet ist? Mich interessieren halt solche Sachen ;)
Microsoft soll ja mittlerweile brauchbare Dokumentation zu ihren internen Systemaufrufen anbieten, finde also raus welcher verwendet wird und lies dich ein. Alternativ gibt es immer noch Linux wenn dir die Zwangsjacke zu eng wird, da ist das Zugriffssystem endlich auch verständlich und mit weniger Magie verbunden :mrgreen:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Gary123456 hat geschrieben:Das ist ein Codeschnipsel aus diesem Forum. Daher steht file auch da. Und da sehe ich keinen Anlass zu ändern, wenns funktioniert.
Und ich habe Dir in meiner Antwort gezeigt, wie es (idiomatisch) richtig geht: http://www.python-forum.de/viewtopic.ph ... 06#p239006

Das ist auch ein Post in diesem Forum - inwiefern hilft das bei der Bewertung der Sinnhaftigkeit? :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Gary123456 hat geschrieben:

Code: Alles auswählen

import os
os.chmod("C:\\$Recycle.Bin", 0o640)
frage ich mich dennoch, für welche Benutzergruppe es diese Rechte ändert? Und auch wenn ich diesen Code auführe, scheint es die Rechte nicht unter die Benutzergruppe "Benutzer" geändert zu haben.
Für sowas gibt's die Dokumentation. Viel Erfolg! http://docs.python.org/3/library/os.html#os.chmod
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Jep,

mein Dickkopf. Ich habs in open geändert.

Nun steht das anders in diesem Galileo Computing Buch drinne und hab zu sehr auf dem vertraut. Jetzt habe ich versucht Rechte zu ändern, jedoch ohne Erfolg:

Code: Alles auswählen

import os, stat, sha

def shasum(filepath, blocksize = 1024 * 1024):  
    h = sha.new()
    with open(filepath, "rb") as f:
        try:
            while True:
                part = f.read(blocksize)
                if not part:
                    break
                h.update(part)
        finally:
            f.close()
   
        return h.hexdigest()

os.chmod("C:\\$Recycle.Bin", stat.S_IRUSR)
os.chmod("C:\\$Recycle.Bin", stat.S_IWUSR)
os.chmod("C:\\$Recycle.Bin", stat.S_IXUSR)
os.chmod("C:\\$REcycle.Bin", stat.S_IRWXU)

print shasum("C:\\$Recycle.Bin")

Ich will dem User volle Rechte über das File geben. Jedoch kommt immer die gleiche Fehlermeldung, dass der Zugang verwährt sei. Warum nur?
BlackJack

@Gary123456: Das steht in der Dokumentation zu `os.chmod()`. Da steht was diese Funktion unter Windows macht. Lies das das einfach mal.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Jep, heute bin ich etwas neben dem Thema, da ich mich auch nebenbei mit SQL befasse. Und mein Schulenglisch ist, wie schon gesagt, nicht das Beste.
Although Windows supports chmod(), you can only set the file’s read-only flag with it (via the stat.S_IWRITE and stat.S_IREAD constants or a corresponding integer value). All other bits are ignored.
Ist damit also gemeint, dass ich bei Windows nur stat.S_IWRITE und stat.S_IREAD benutzen darf?

Code: Alles auswählen

import os, stat, sha

def shasum(filepath, blocksize = 1024 * 1024):  
    h = sha.new()
    with open(filepath, "rb") as f:
        try:
            while True:
                part = f.read(blocksize)
                if not part:
                    break
                h.update(part)
        finally:
            f.close()
   
        return h.hexdigest()

os.chmod("C:\\$Recycle.Bin", stat.S_IREAD)


print shasum("C:\\$Recycle.Bin")

Gleiches Problem. Wieder son dämlicher Fehler?
Antworten