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.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gary123456: ich hab hier kein Windows zum Testen, aber es gibt Dateien und Verzeichnisse unter Windows, auf die man, egal welche Rechte man auch besitzt, nicht zugreifen kann, und dazu kann mit ziemlicher Sicherheit auch "$RECYCLE.BIN" gehören.
Auch können bereits von anderen Processen geöffnete Dateien nicht gelesen/verändert werden.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

OK. Ich werde mich bei einem Windows Profi informieren. Und ich habe ein duales System am Laufen : Linux und Windows, nicht das ihr meint, dass ich nur Windos so gern mag :P
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Wie es scheint, ist die Idee mitm SHA HASH WERT ermitteln futsch. Ich bräcuhte wohl etwas API, soweit ich das verstanden habe.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Code: Alles auswählen

import os
import sha

Ordner_Liste = [r"C:\\", r"C:\\Windows", r"C:\\Users"]

with open("test.txt", "w") as textdatei:
    for path in Ordner_Liste:
        for entry in os.listdir(path):
            textdatei.write(os.path.join(path, entry) + "\n")
            textdatei.write("")
Mein bisheriger Code. Mal sehen, was noch ohne Rechte möglich ist.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Du hast wohl die Sache mit den Rechten missverstanden, die Dokumentation sagt eindeutig die einzige mögliche änderung mit chmod wäre es die Datei oder den Ordner ausschließlich lesbar zu machen. Das willst du nicht. Also lass die Finger davon.

Dann bleiben nur noch die Zugriffsrechte für Ordner übrig in die du reinsiehst. Sollte es keinen Unterschied geben ob du dein Programm mit erhöhten Rechten startest oder nicht, dann greifst du auf einen der besonderen Ordner zu auf die sowieso niemand zugreifen darf.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Du hast wohl die Sache mit den Rechten missverstanden, die Dokumentation sagt eindeutig die einzige mögliche änderung mit chmod wäre es die Datei oder den Ordner ausschließlich lesbar zu machen. Das willst du nicht. Also lass die Finger davon.
Das habe ich auch so verstanden.

Ich lass es auch vorerst mit den Rechten sein.

Code: Alles auswählen

import os
import sha

Ordner_Liste = [r"C:\\", r"C:\\Windows", r"C:\\Users"]

with open("test.txt", "w") as textdatei:
    try:
        for path in Ordner_Liste:
            for entry in os.listdir(path):
                textdatei.write(os.path.join(path, entry) + "\n")
                textdatei.write(str(os.path.getsize(os.path.join(path, entry))))
                textdatei.write("")
    except OSError:
        textdatei.write("Datei existiert nicht oder ist unzugänglich!")
Dokumentation:
Return the size, in bytes, of path. Raise OSError if the file does not exist or is inaccessible.
Ich habe folgende Probleme:

1. Bei vielen (nicht leeren) Ordner gibt es 0 Bytes zurück? Sind die Ordner zu groß?
2. Bei "textdatei.write(str(os.path.getsize(os.path.join(path, entry))))" muss ich es nach string konventieren. Aber warum? Ohne String kommt diese Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\Gary\Desktop\Programmierung\Python\Projekte\Sonstiges\test7.py", line 11, in <module>
    textdatei.write(os.path.getsize(os.path.join(path, entry)))
TypeError: expected a character buffer object
Ich versteh das nicht.

Danke für eure Hilfe!
BlackJack

@Gary123456: Die Grösse eines Ordners ist nicht die Grösse der Dateien darin, sondern tatsächlich wie gross der *Ordner* ist.

Zum `write()`: Die Fehlermeldung sagt doch ziemlich deutlich warum Du die Zahl in eine Zeichenkette umwandeln musst. Weil `write()` nun mal keine Zahlen erwartet.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Zum `write()`: Die Fehlermeldung sagt doch ziemlich deutlich warum Du die Zahl in eine Zeichenkette umwandeln musst. Weil `write()` nun mal keine Zahlen erwartet.
Jap darauf hätte ich selber kommen können :oops:
@Gary123456: Die Grösse eines Ordners ist nicht die Grösse der Dateien darin, sondern tatsächlich wie gross der *Ordner* ist.
Also jeder Ordner ist dann 0? Wie kann man das dann für Ordner und Dateien machen? Gibt es dafür auch einen Befehl, oder nicht?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Gary123456 hat geschrieben:Wie kann man das dann für Ordner und Dateien machen? Gibt es dafür auch einen Befehl, oder nicht?
So

Du bentutz bei raw-Strings noch immer doppelte Backslashes. Die dürfen dort nicht hin.
Das Leben ist wie ein Tennisball.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Jep. Habe mit den Sha Hash Wert doch weiter rumprobiert und doch einen kleinen Erfolg erzielt: Ich habe abgefragt, ob es sich um eine Datei handelt, denn von einem Ordner kann es ja die SHA Summe nicht berechnen. Jetzt hakt es nur bei hiberfil.sys
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Du bentutz bei raw-Strings noch immer doppelte Backslashes. Die dürfen dort nicht hin.
Der Code funkt ohne nicht. Das gleiche Problem hatte ich schon in einer anderen Programmiersprache (XPROFAN).

Code: Alles auswählen

import os
import 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()

Ordner_Liste = [r"C:\\"]
                
Schreibgeschuetzt = [r"C:\\hiberfil.sys", r"C:\\pagefile.sys"]

with open("test.txt", "w") as textdatei:
    try:
        for path in Ordner_Liste:
            for entry in os.listdir(path):
                textdatei.write(os.path.join(path, entry) + "\n")
                textdatei.write(str(os.path.getsize(os.path.join(path, entry))/1024)+ " " + "MB")

                if os.path.isfile(os.path.join(path, entry)) == True:
                    for geschuetzt in Schreibgeschuetzt:
                        if os.path.join(path, entry) != geschuetzt:    
                            textdatei.write(shasum(os.path.join(path, entry)))
                        else:
                           pass
                            
                else:
                    pass
                textdatei.write("")

    except OSError:
        textdatei.write("Datei existiert nicht oder ist unzugänglich!")
1. Wie kann ich eine Datei überspringen? Gibt es ein spezielles Schlüsselwort, dass die for Schleife um 1 erhöht. Den entry oder path um 1 zu erhöhen geht logischerweise nicht.
2. Kann man diesen Code noch vereinfachen?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Gary123456 hat geschrieben:Der Code funkt ohne nicht. Das gleiche Problem hatte ich schon in einer anderen Programmiersprache (XPROFAN).
Dinge aus einer Programmiersprache unkritisch in eine andere zu übertragen ist keine gute Idee. Was glaubst du denn, was das einleitende r in der Stringdefinition r"C:\\hiberfil.sys" bewirkt?

Zu deinem Problem mit der for-Schleife: http://docs.python.org/2/tutorial/contr ... s-on-loops
Zuletzt geändert von /me am Mittwoch 24. April 2013, 14:16, insgesamt 1-mal geändert.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Fakt ist, dass das ohne einfachen \ nicht funktioniert. Was soll ich machen?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Gary123456 hat geschrieben:Fakt ist, dass das ohne einfachen \ nicht funktioniert. Was soll ich machen?
Lernen. Lernen wie ein String wirklich aussieht. Lernen, wie man sinnvolle Fehlerbeschreibungen jenseits von "geht nicht" angibt.

Schau dir die Darstellung des Strings an. Das ist in IDLE eine Sache von Sekunden.

Code: Alles auswählen

>>> r"C:\\hiberfil.sys"
'C:\\\\hiberfil.sys'
Du siehst hier ganz eindeutig, dass du zwei Backslashes hast und Windows-Pfade haben halt nur einen als Trenner.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Mit dieser Zeile:

Code: Alles auswählen

Ordner_Liste = [r"C:\"]
will der Code nicht funktionieren. Es scheint so, als ob er die Klammer (hinten) auch als String definiert, da sie als grün gekennzeichnet ist. Was Du sagst, weiss ich. Jedoch listet es mit dem zurzeitigen Code mit \\ korrekt auf.

wenn ich die Zeile so ummändere:

Code: Alles auswählen

Ordner_Liste = [r"C:"]
Listet es alle .py Dateien auf (nicht unter C:\!)

auch wenn ich das mache:

Code: Alles auswählen

Ordner_Liste = ["C:\"]
ist die letzte Klammer grün (-> String) -> Fehlermeldung

Beweis:
Bild
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Gary123456 hat geschrieben:Mit dieser Zeile:

Code: Alles auswählen

Ordner_Liste = [r"C:\"]
will der Code nicht funktionieren.
Ein raw string darf nicht mit einem einzelnen Backslash enden.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich würde ja sagen, das ist ein Bug in Python, aber ich weiß auch nicht, ob das Problem schon in entsprechenden Kreisen diskutiert wurde und für gut befunden.
Der Parser von Python (also der Teil, der Pythoncode als Text nimmt und ihn in Einheiten wie Zahlen, Klammern, Strings, usw. zerhackt) kennt keine Rawstrings. Daher interpertiert er, egal ob ein r davor steht oder nicht alle \" als Sonderzeichen und erkennt damit das Stringende nicht. Also, falls das letzte Zeichen eines Strings \ ist, darf man keinen Raw-String benutzen. Korrekt wäre also ["C:\\"].
BlackJack

@Sirius3: Wurde schon diskutiert — kann mich daran erinnern, dass das ein paar mal in der Newsgroup aufkam als ich da noch mitgelesen habe — und wurde zwar nicht als Feature verkauft, aber auch nicht als Bug dargestellt. Und dort haben (zumindest damals) einige Python-Devs dort mitgelesen und -diskutiert.
Benutzeravatar
kevind
User
Beiträge: 71
Registriert: Montag 22. Oktober 2012, 20:23
Wohnort: /dev/null

Also ich weiss ja nicht aber mit dem

Code: Alles auswählen

hiberfil.sys
würde ich eher vorsichtig sein.

Sorry ist vl. etwas OT...
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

@kevind) Ich weiß ganz genau was die macht, warum sie da ist etc. Naja löschen wär ja ned so praktisch.

@Sirius3) Also stimmt meins doch?
1. Wie kann ich eine Datei überspringen? Gibt es ein spezielles Schlüsselwort, dass die for Schleife um 1 erhöht. Den entry oder path um 1 zu erhöhen geht logischerweise nicht.
2. Kann man diesen Code noch vereinfachen?
Antworten