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.
BlackJack

@Gary123456: Dann gibst Du die Dateinamen an der falschen Stelle aus. Du hast anscheinend Schleifen noch nicht wirklich verstanden.

Wenn es nicht sinnbefreit ist, dann erklär doch mal den Sinn davon eine Datei zu öffnen die überhaupt nicht benutzt wird? Ich versteh's nicht.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Code: Alles auswählen

import os
import sha
import 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:
            f.close()   
            return h.hexdigest()

def main():
    with open("Testdatei.txt", "w") as textdatei:
        geschuetzte_files = ["hiberfil.sys", "pagefile.sys"]
        verzeichnis = "C:\\"
        files = os.listdir(verzeichnis)

        for geschuetzt in geschuetzte_files:
            try:
                if verzeichnis == "C:\\":
                    files.remove(geschuetzt)
                else:
                    continue
            except ValueError:
                print "VALUEERROR: Zu viel oder zu wenig geschuetzte Files"

        for file in files:
            pfad = os.path.join(verzeichnis, file)
            try:
                if os.path.isfile(pfad) == True:
                    textdatei.write(pfad + "Größe: " + str(os.path.getsize(pfad)/1024)+ "MB" + " SHA: " + \
                                    shasum(pfad) + "\n")
                else:
                    continue
            except IOError:
                textdatei.write("IOERROR: Keine Berechtigungen!")

        textdatei.close()


if __name__ == "__main__":
    main()
Kann gut sein, dass es bei älteren System ne exception haut, müsste da zu der geschuetzefiles liste noch EInträge hinzufuegen! Wie bewertet Ihr den Code?
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

Gary123456 hat geschrieben:Wie bewertet Ihr den Code?
In shasum() brauchst du afaik f nicht explizit zu schließen, das macht das with-Statement schon für dich. Für textdatei gilt das Gleiche.

In main() kannst du

Code: Alles auswählen

for geschuetzt in geschuetzte_files:
aus dem with-Statement herausziehen. Die if-Abfrage in dem Bereich ist eh überflüssig, da du die Variable "verzeichnis" nicht änderst, soweit ich das sehe. Eine Funktion, die einfach alle geschützten Dateien löscht ist ja auch nicht verkehrt. :wink:

Code: Alles auswählen

if os.path.isfile(pfad) == True:
heißt kurz

Code: Alles auswählen

if os.path.isfile(pfad):
Ich weiss zwar immer noch nicht, was du vorhast, aber das wird schon. :wink:

Xe
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hallo,

hier neuer Code:

Code: Alles auswählen

import os
import sha
import 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:
        geschuetzte_files = ["hiberfil.sys", "pagefile.sys"]
        verzeichnis = "C:\\"
        files = os.listdir(verzeichnis)
        for geschuetzt in geschuetzte_files:
            try:
                if verzeichnis == "C:\\":
                    files.remove(geschuetzt)
                else:
                    continue
            except ValueError:
                print "VALUEERROR: Zu viel oder zu wenig geschuetzte Files"
        for file in files:
            pfad = os.path.join(verzeichnis, file)
            try:
                if os.path.isfile(pfad):
                    textdatei.write(pfad + "Größe: " + str(os.path.getsize(pfad)/1024)+ "MB" + " SHA: " + \
                                    shasum(pfad) + "\n")
                else:
                    continue
            except IOError:
                textdatei.write("IOERROR: Keine Berechtigungen!")


if __name__ == "__main__":
    main()
aus dem with-Statement herausziehen. Die if-Abfrage in dem Bereich ist eh überflüssig, da du die Variable "verzeichnis" nicht änderst, soweit ich das sehe. Eine Funktion, die einfach alle geschützten Dateien löscht ist ja auch nicht verkehrt. :wink:
Kann ich, aber so gehts auch. :) Ich werde die Variable Verzeichnis schon ändern, aber noch nicht jetzt :) Wenn Du alle geschützten Files löscht, ist der PC hinne und wäre ohne API auch nicht möglich.
Ich weiss zwar immer noch nicht, was du vorhast, aber das wird schon. :wink:
Ich will, ein Programm schaffen, dass in bestimmten Ordner nach Dateien scannt. Da das Tool OTL nicht alles auflistet, ist solch ein Skript nie schlecht und könnte für spätere Zwecke genutzt werden. Damit wird z.B. auch Malwaredateien aufgelistet, falls sie nicht versteckt sind!

Nun zu einer anderen Frage: Ich will mit py2exe eine exe erstellen. Ihr habt, denke ich mal, gesagt, dass diese exe nicht auf jeden Rechner läuft? Auf welche Rechner läuft denn diese exe nicht?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Entscheide dich mal für eine Sprache in deinem Code: Englisch oder Deutsch. Beides zu mischen ist wirklich unschön. Auch wurdest du schon darauf hingewiesen, dass in ``file`` bzw. ``files`` keine Dateien drin stecken, sondern DateiNAMEN. Dann sollten die Variablen auch so heißen.

In deinem unteren with-Block steckt viel zu viel Code. Die obere Hälfte solltest du da raus ziehen, sie hängt gar nicht von der geöffneten Datei ab. In with- und try-Blöcken sollte immer so wenig Code wie möglich stehen. Dadur können Abhängigkeiten leichter erkannt und Fehler vermieden werden.

Die ``else: continue``-Stücke solltest du dir sparen. Sie haben genau gar keine Wirkung.

Strings werden nicht mit + zusammengesetzt, sondern mittels String Formatting. Wenn dir das nichts sagt, dann solltest du mal danach suchen.

Wie soll jemals ein IOError im letzten Block geworfen werden, der keine Berechtigung impliziert? Die Datei ist doch bereits geöffnet.
Das Leben ist wie ein Tennisball.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Gary123456 hat geschrieben:Nun zu einer anderen Frage: Ich will mit py2exe eine exe erstellen. Ihr habt, denke ich mal, gesagt, dass diese exe nicht auf jeden Rechner läuft? Auf welche Rechner läuft denn diese exe nicht?
Wenn es eine 64-Bit EXE ist, dann auf keinem Rechner der mit 32-Bit läuft. Auf Linux-Rechnern nicht. Auf Mac OS X-Rechnern nicht. Auf Windows RT und Surface nicht. Auf Smartphones nicht (also, weder Android noch iOS). Auf Taschenrechnern nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Auf einem IBM Mainframe auch nicht *SCNR*
Benutzeravatar
/me
User
Beiträge: 3558
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

jerch hat geschrieben:Auf einem IBM Mainframe auch nicht *SCNR*
Da brauchst du nicht mal ein SCNR, das ist ein absolut realer Anwendungsfall. Gleiches gilt übrigens für Maschinen die mit Solaris laufen.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

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():
    geschuetzte_filenames = ["hiberfil.sys", "pagefile.sys"]
    verzeichnis = "C:\\"
    filenames = os.listdir(verzeichnis)
    for geschuetzt in geschuetzte_filenames:
        try:
            if verzeichnis == "C:\\":
                filenames.remove(geschuetzt)
        except ValueError:
            print "VALUEERROR: Zu viel oder zu wenig geschuetzte Files"


    with open("Testdatei.txt", "w") as textdatei:
        for file in filenames:
            pfad = os.path.join(verzeichnis, file)
            try:
                if os.path.isfile(pfad):
                    textdatei.write("{} Größe: {} MB SHA: {} \n".format(pfad, os.path.getsize(pfad)/1024, shasum(pfad)))
            except IOError:
                textdatei.write("IOERROR: Keine Berechtigungen!")

if __name__ == "__main__":
    main()
Code jetzt schöner?
Wie soll jemals ein IOError im letzten Block geworfen werden, der keine Berechtigung impliziert? Die Datei ist doch bereits geöffnet.
Bezieht sich ja nicht die Textdatei, sondern die Datei, bei der gerade der SHA Wert ausgelesen wird. Daher try und except :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Gary123456 hat geschrieben:
Wie soll jemals ein IOError im letzten Block geworfen werden, der keine Berechtigung impliziert? Die Datei ist doch bereits geöffnet.
Bezieht sich ja nicht die Textdatei, sondern die Datei, bei der gerade der SHA Wert ausgelesen wird. Daher try und except :)
Nein, Programmieren durch Raten. Dein Code tut nicht das was du denkst, dass er tut:

Code: Alles auswählen

In [1]: def foo():
    try:
        raise Exception()
    finally:
        return 1
   ...:     

In [2]: foo()
Out[2]: 1
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.
Antworten