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

Ich rate sicher nicht. Ich versteh nicht, was das ist. Ich meine diese in und outs. Wie nennt man das? Wozu ist nötig?

Man könnte in die Funktion auch dieses except tun. Es könnte dann aber sein, dass dieses getsize nicht genügen Berechtigungen hat. Oder man macht es ausserhalb der with-Anweisung. Das würde auch gehen.
Wie soll jemals ein IOError im letzten Block geworfen werden, der keine Berechtigung impliziert? Die Datei ist doch bereits geöffnet.
D.h. ich mach sie vor der with-Anweisung.

Ich werde noch etwas überlegen. Aber nebensächlich: Wie schaut der Rest des Codes aus? Man hätte noch eine verschachtelte Liste machen können: Liste = [["Verzeichnisnamen", ("Geschützte Dateien", ... )], ["blablabla", (...)]]

Dann gebe ich diese mit einer for-Schleife auf und dann habe ich eine wunderschöne Datenstruktur verwendet. Ich werds mal probieren.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Gary123456 hat geschrieben:Ich rate sicher nicht. Ich versteh nicht, was das ist. Ich meine diese in und outs. Wie nennt man das? Wozu ist nötig?
Die haben absolut nichts mit dem Problem zu tun und kommen von Ipython. Das Problem ist, dass dein `shasum` nie eine Ausnahme werfen wird und noch schlimmer: Am Ende ein falsches aber richtig aussehendes Ergebnis liefert.
Gary123456 hat geschrieben:Es könnte dann aber sein, dass dieses getsize nicht genügen Berechtigungen hat.
Das ist doch genauso raten ...
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Das ist doch genauso raten ...
Ist nicht raten. Wenn die die .py nicht zugreifen kann, kommt ne exception, dass es keine Berechtigungen hat.

Mit schöner Datenstruktur:

Code: Alles auswählen

import os, sha, filecmp

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: 
            return h.hexdigest()

def main():
    with open("Testdatei.txt", "w") as textdatei:
        verzeichnisse = [("C:\\", ["hiberfil.sys", "pagefile.sys"]), ("C:\\Users\\Gary", ["NTUSER.DAT", "ntuser.dat.LOG1", "ntuser.dat.LOG2"])]
        for verzeichnis, geschuetzt in verzeichnisse:
            files_liste = os.listdir(verzeichnis)        
            for geschuetzte_dateien in geschuetzt:
                if geschuetzte_dateien in files_liste:
                    files_liste.remove(geschuetzte_dateien)
            for file in files_liste:
                pfad = os.path.join(verzeichnis, file)
                if os.path.isfile(pfad):
                    textdatei.write("FI {} Größe: {} MB SHA: {} \n".format(pfad, os.path.getsize(pfad)/1024, shasum(pfad)))
                if os.path.isdir(pfad):
                    textdatei.write("OR {} \n".format(pfad))
                                   
if __name__ == "__main__":
    main()
        
Und erweiteter Funktionen :)
Die haben absolut nichts mit dem Problem zu tun und kommen von Ipython. Das Problem ist, dass dein `shasum` nie eine Ausnahme werfen wird und noch schlimmer: Am Ende ein falsches aber richtig aussehendes Ergebnis liefert.
Warum sollte diese ein falsches Ergebnis liefern?
BlackJack

@Gary123456: Das wird irgendwie alles nicht besser. Du bindest schon wieder einen einzelnen Dateinamen an so etwas wie `geschuetzte_dateien`. Das macht den Quelltext unverständlich, weil der Leser völlig falsche Annahmen macht, bei solchen Namen.

Ich verstehe auch nicht was die Listen mit den Namen von geschützten Dateien sollen. Ob man auf eine Datei zugreifen kann, lässt sich doch einfach heraus finden, in dem man es *tut*. Wenn es nicht klappt, analysiert man den Grund warum es nicht geklappt hat.

Und wieso hast Du den `ValueError` beim `remove()` jetzt durch ein allgemeines `Exception` ersetzt, was in dieser Form fast genau so schlimm ist wie ein „nacktes” ``except:``. Auch hier werden jetzt Ausnahmen falsch behandelt, die gar nichts mit der Meldung zu tun haben, die im ``except``-Zweig ausgegeben werden.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Und wieso hast Du den `ValueError` beim `remove()` jetzt durch ein allgemeines `Exception` ersetzt, was in dieser Form fast genau so schlimm ist wie ein „nacktes” ``except:``. Auch hier werden jetzt Ausnahmen falsch behandelt, die gar nichts mit der Meldung zu tun haben, die im ``except``-Zweig ausgegeben werden.
Habe ich bereits editiert. Eine leichte Bedingung hätte es auch getan.
Ich verstehe auch nicht was die Listen mit den Namen von geschützten Dateien sollen. Ob man auf eine Datei zugreifen kann, lässt sich doch einfach heraus finden, in dem man es *tut*. Wenn es nicht klappt, analysiert man den Grund warum es nicht geklappt hat.
Es ist eine Eigenart von Windoof, das man auf bestimmte Dateien keinen Zugriff hat und das ist gewollt. Daher muss ich eine Liste machen, um diese legitimen Files vom Scan auszuschließen. Diese Files sing geschützt, da sie Systemdateien sind und dringenst gebraucht werden. Gibt es diese Files nicht, funktioniert derComputer nicht. Und geschützt sind sie dewegen, um sich vor Gefahren zu schützen. Ganz einfach. Das ist der Grund. Da habe ich mich ja bei einem Spezialisten erkundigt.
@Gary123456: Das wird irgendwie alles nicht besser. Du bindest schon wieder einen einzelnen Dateinamen an so etwas wie `geschuetzte_dateien`. Das macht den Quelltext unverständlich, weil der Leser völlig falsche Annahmen macht, bei solchen Namen.
Ich verstehe genau , was Du meinst. Und habe es auch versucht zu berücksichtigen. Nur fallen mir dummerweise nie geeignete Namen ein. Lasst mich überlegen. Es gibt neuen Code.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@Gary123456: Warum schreibst Du nach all den Verbesserungshinweisen immer noch diese üble shasum-Funktion? Ich habe sie Dir zur Ansicht mal etwas aufgeräumt: jetzt wird entweder ein hexdigest zurückgegeben, oder es wird eine Exception geworfen, die Du ausserhalb der Funktion abfängst.

Code: Alles auswählen

def sha_sum(filepath, blocksize = 1024 * 1024): 
    h = sha.new()
    with open(filepath, "rb") as f:
        while True:
            part = f.read(blocksize)
            if not part:
                break
            h.update(part)
    return h.hexdigest()
Und main() mag ich mir gar nicht mehr anschauen ...
BlackJack

@Gary123456: Die „leichte” Bedingung ist aufwändiger als den `ValueError` zu behandeln wenn der gesuchte Wert enthalten ist. Denn die Bedingung muss ja die Liste Element für Element durchgehen um zu testen ob der Dateiname enthalten ist. Wenn er das ist, dann geht das `remove()` *wieder* die Liste Element für Element durch, bis der Dateiname *wieder* gefunden ist.

Du hast IMHO immer noch nicht erklärt was die die Datenstruktur mit den Namen der geschützten Dateien soll. Das es geschützte Dateien gibt, und warum die geschützt sind, weiss ich. Aber warum scannst Du nicht einfach und behandelst die entsprechende Ausnahme wenn Du auf eine geschützte Datei triffst? Warum muss es da vorher eine Liste geben und extra Code der diese Namen entfernt?

Das man einem einzelnen Wert keinen Namen im Plural gibt, da muss man nicht lange überlegen. Das lässt sich ganz einfach vermeiden.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ich mach mir hald gern das Leben schwer. :evil:

Code: Alles auswählen

import os, sha

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

def main():
    with open("Testdatei.txt", "w") as textdatei:
        verzeichnisse = ["C:\\", "C:\\Users"]    
        for verzeichnis in verzeichnisse:
            for datei in os.listdir(verzeichnis):
                pfad = os.path.join(verzeichnis, datei)
                try:
                    if os.path.isfile(pfad):
                        textdatei.write("FI {} Größe: {} MB SHA: {} \n".format(pfad, os.path.getsize(pfad)/1024, shasum(pfad)))
                    elif os.path.isdir(pfad):
                        textdatei.write("OR {} \n".format(pfad))
                except IOError:
                    continue
if __name__ == "__main__":
    main()
        
Jetzt sollte es aber passen. Ich habs sogar extra auf die Namensgebung geachtet. Und wenns wieder falsch ist, überleg ich mir, ob das mitm Programmieren noch Sinn hat. :shock:
Zuletzt geändert von Gary123456 am Montag 29. April 2013, 15:39, insgesamt 2-mal geändert.
BlackJack

@Gary123456: Das bricht mit einem `NameError` ab.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Das passiert, wenn man kurz vorm verzweifeln ist und den Code nicht testet :evil: Jetzt getesteter Code. Den oberen Code editiert.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Dokumentation zum Modul „sha“ hat geschrieben: Deprecated since version 2.5: Use the hashlib module instead.
Einfach „sha“ durch „hashlib.sha1“ ersetzen, das funktioniert dann auch mit Python 3. Außerdem importierst du das Modul „filecmp“, obwohl du es nicht verwendest.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Aber allgemein ist der Code besser als vorher? (Warum gibt es kein Wein-Smiley?) Ich werde mir das Modul mal ansehen ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Gary123456 hat geschrieben:
cofi hat geschrieben:
Gary123456 hat geschrieben:Es könnte dann aber sein, dass dieses getsize nicht genügen Berechtigungen hat.
Das ist doch genauso raten ...
Ist nicht raten. Wenn die die .py nicht zugreifen kann, kommt ne exception, dass es keine Berechtigungen hat.
Natürlich ist es Raten, wenn man nicht die möglichen Fehler in der Dokumentation nachschaut:
http://docs.python.org/2.7/library/os.path.html#os.path.getsize hat geschrieben:os.path.getsize(path)
Return the size, in bytes, of path. Raise os.error if the file does not exist or is inaccessible.
Das Leben ist wie ein Tennisball.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Ich finde den Code schon besser. Würde die Definition von „verzeichnisse“ wohl direkt unter „main“ schreiben, außerdem stimmt die Dateigröße, die du angibst, nicht. „os.path.getsize“ liefert die Größe in Bytes, und 1024 Bytes sind 1 KiB. (1024 KiB sind übrigens 1 MiB. →Wikipedia)
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ich denke, dass ich weitgehenst fertig bin:

Code: Alles auswählen

import os, sha

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

def main():
    #Verzeichnisse = Unter diesen Verzeichnisse sollen Dateien gelistet werden
    with open("Testdatei.txt", "w") as textdatei:
        verzeichnisse = ["C:\\", "C:\\Users"]    
        for verzeichnis in verzeichnisse:
            for datei in os.listdir(verzeichnis):
                pfad = os.path.join(verzeichnis, datei)
                try:
                    if os.path.isfile(pfad):
                        textdatei.write("FI {} Größe: {} MB SHA: {} \n".format(pfad, (os.path.getsize(pfad)/1024)/1024.0, shasum(pfad)))
                    elif os.path.isdir(pfad):
                        textdatei.write("OR {} \n".format(pfad))
                except IOError:
                    continue
if __name__ == "__main__":
    main()
Würde die Definition von „verzeichnisse“ wohl direkt unter „main“ schreiben,

Du meinst also als Kommentar die Definition?
Antworten