Seite 3 von 6
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 15:58
von /me
Gary123456 hat geschrieben:@Sirius3) Also stimmt meins doch?
Nein, tut es nicht. Wenn ein String mit einem Backslash endet, dann solltest du keine raw strings verwenden. Wenn nicht, dann kannst du raw strings verwenden, solltest dann aber wenn du innerhalb des Strings
einen Backslash haben willst auch nur
einen angeben und nicht zwei..
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 16:00
von webspider
Raw-Strings sollte man sowieso nur in regulären Ausdrücken verwenden. Einen Schleifendurchgang kann man mit continue abbrechen, aus der Schleife selbst springt man mit break raus. Und os.walk() bietet sich ebenfalls an zum Durchwandern von Ordnern.
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 16:16
von Gary123456
Nein, tut es nicht. Wenn ein String mit einem Backslash endet, dann solltest du keine raw strings verwenden. Wenn nicht, dann kannst du raw strings verwenden, solltest dann aber wenn du innerhalb des Strings einen Backslash haben willst auch nur einen angeben und nicht zwei..
Ich werd verrückt. Ohne raw_strings das gleiche Problem:
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 = ["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:
continue
else:
pass
textdatei.write("")
except OSError:
textdatei.write("Datei existiert nicht oder ist unzugänglich!")
except IOError:
textdatei.write("Keine Berechtigungen!")
Warum springt es micht zum nächsten entry? Oder ist das except Schuld?
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 16:26
von webspider
continue hat nur eine Wirkung auf die nächstgelegene Schleife, die äußere bleibt also ungerührt davon. Daher solltest du Refactoring betreiben und sowas auf Funktionen aufteilen bis dir die Logik klar und offensichtlich wird.
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 16:58
von xeike
Gary123456 hat geschrieben:Ich werd verrückt. Ohne raw_strings das gleiche Problem:
Ja, die Backslashes leiten besondere Zeichen ein. \" heißt so viel wie: Füge das Zeichen '"' mit in die Zeichenkette ein.
Wenn du Linux, BSD oder MacOS X hättest, dann würde dein Verzeichnis vielleicht "/home/gary" (oder so ähnlich) lauten und du hättest das Problem mit dem Backslash nicht.
Edit: Geht eigentlich
unter windows?
Warum springt es micht zum nächsten entry? Oder ist das except Schuld?
Wie soll es denn aussehen?
Vielleicht hilft eine Variable "brich_schleife_ab" oder die "break"-Anweisung?
Xe
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 18:03
von Sirius3
@Gary123456: also an Deinem Code ist noch so einiges nicht in Ordnung. Teile Deinen Code in Funktionen auf, die eine genau bestimmte Aufgabe haben, zum Beispiel eine Funktion, die testet ob die als Parameter übergebene Datei in einer Liste von anderen Dateien vorkommt, dazu gibt es im Übrigen eine passende Funktion: »os.path.samefile«, da wegen Deiner Doppelbackslashes in Rawstrings ein direkter Vergleich immer Fehlschlägt. Dann willst Du wahrscheinlich, dass falls eine nichtlesbare Datei in einem Ordner ist, nicht gleich die ganze Schleife abbricht, würde Dir einfacher fallen, wenn Du eine Funktion hättest, die den gesamten Infotext erzeugt. Dann benutzt Du 5! mal den gleichen »os.path.join«!
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 19:16
von Gary123456
im Übrigen eine passende Funktion: »os.path.samefile«
Läuft leider nur unter Unix.
Ich habe das gefunden: os.path.normcase(path) auf diesen Rat hin:
http://stackoverflow.com/questions/8892 ... python-2-7 Was haltet Ihr davon? Welche Möglichkeiten gibt es noch?
Folgender Code, der aber wegen dem os.path.samefile nicht so ganz funkt:
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()
#Alternative für die 5 os.path.join's
def path_join(path, entry):
return os.path.join(path, entry)
#Groesse berechnen
def groesse(path):
return os.path.getsize(path)
#Geschütze ignorieren
def sha_wert(path, pfad, Geschuetzt):
for geschuetzt in Geschuetzt:
if os.path.samefile(path, os.path.join(pfad, Geschuetzt)) == True:
return shasum(os.path.join(path, entry))
else:
continue
Verzeichnisse = ["C:\\"]
Geschuetzt = ["C:\\hiberfil.sys"]
for path in Verzeichnisse:
for entry in os.listdir(path):
Pfad = path_join(path, entry)
Groesse = int(groesse(Pfad)) / 1024
Sha = sha_wert(Pfad, path, Geschuetzt)
print Pfad
print Groesse
Besser?
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 20:06
von darktrym
Ganz ehrlich,
wäre ich dein Chef und du würdest mir das als Ergebnis präsentieren, würde ich dich zur Strafe an den Nichtfeier- & Sonntagen zwischen Weihnachten und Neujahr arbeiten lassen. Ist ja eine Beleidigung für jeden Programmierer.
Pep8, with block und close, sinnlose int Umwandlung, explizites True, sinnloses continue usw.-
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 20:10
von Gary123456
Ich habe mein Bestes gegeben. Was der "Chef" dazu sagen würde, wäre mir egal, da ich in Python noch übe. Ich finde diese Aussage nicht fair. Dennoch versuche ich den Code zu verbessern.
EDIT: Ja und ich habe einige Fehler gesehen und bisher ausgebessert. Mal sehen, ob ich noch welche finde

Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 20:34
von Gary123456
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()
def sha_wert(path, verzeichnis, geschuetzt):
for geschuetzt in geschuetzt:
if os.path.samefile(path, os.path.join(verzeichnis, geschuetzt)):
return shasum(os.path.join(path, entry))
verzeichnisse = ["C:\\"]
geschuetzt = ["C:\\hiberfil.sys"]
for path in verzeichnisse:
for entry in os.listdir(path):
Pfad = os.path.join(path, entry)
Groesse = os.path.getsize(Pfad)
Sha = sha_wert(Pfad, path, geschuetzt)
Pep8 kann ich nicht so ganz nachvollziehen.
Wenn man == True hinschreibt, fällt es einem Einsteiger wie mir viel leichter. Glaub mir.
Zwei Funktionen waren unnötig.
Aber für heute ist Schluss
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 20:43
von darktrym
Dann schau dir bspw. mal shasum an, du brichst eine Endlosschleife via break ab statt über die Kopfbedingung zu gehen, warum gibts die wohl?
Deine Einrückung beim return ist auch so ein Ding.
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 20:53
von webspider
Ich befürchte da versteht jemand
das with-Statement nicht. Es ist da um try-finally zu vermeiden.
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 20:59
von BlackJack
@darktrym: Die ``while``-Schleife ist schon so in Ordnung, denn es ist nun mal semantisch keine kopfgesteuerte Schleife. Die Lesefunktion sowohl vor als auch innerhalb der Schleife aufrufen zu müssen halte ich für wesentlich unschöner. Verletzt das DRY-Prinzip.
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 21:09
von darktrym
Ich hätte den Vergleich von part in den Kopf der Schleife verlegt.
Semantisch jedenfalls besser als eine Endlosschleife die irgendwo abgebrochen wird.
Re: Lister - Programmidee
Verfasst: Mittwoch 24. April 2013, 21:27
von BlackJack
@darktrym: Finde ich nicht. Denn wenn Du im Kopf der Schleife prüfst, dann muss `part` *vorher* ja irgendwie definiert werden, weil es Teil des Prüfausdrucks ist. Und genau da wird es meiner Meinung nach hässlicher als diese Lösung, die eine idiomatische Lösung für diese Problemart ist. Denn man muss dafür den Leseaufruf aus der Schleife kopieren. Das verletzt das DRY-Prinzip.
Re: Lister - Programmidee
Verfasst: Donnerstag 25. April 2013, 07:11
von xeike
Hey,
eine Lösung da heraus kann das simulieren einer fußgesteuerten Schleife sein:
Code: Alles auswählen
with open('test.dat', 'r') as datei:
... firstrun = True
... part = 0
... while firstrun or part:
... part = datei.read(10)
... print(part)
... firstrun = False
Aber ich würde mich auch nicht zu sehr an "DRY" halten wollen.
Xe
Re: Lister - Programmidee
Verfasst: Donnerstag 25. April 2013, 07:35
von Sirius3
Die einzige akzeptable Lösung, ist das Problem in eine eigene Funktion auszulagern:
Code: Alles auswählen
class ChunkReader:
def __init__(self, fileobj, chunksize):
self.fileobj = fileobj
self.chunksize = chunksize
def __iter__(self):
return self
def next(self):
result = self.fileobj.read(self.chunksize)
if not result:
raise StopIteration()
return result
def shasum(filepath, blocksize = 1024 * 1024):
hash = sha.new()
with open(filepath, "rb") as reader:
for block in ChunkReader(reader, block size):
hash.update(block)
return hash.hexdigest()
Re: Lister - Programmidee
Verfasst: Donnerstag 25. April 2013, 08:49
von kevind
Gary123456 hat geschrieben:@kevind) Ich weiß ganz genau was die macht, warum sie da ist etc. Naja löschen wär ja ned so praktisch.
Darin wird der Inhalt des Arbeitsspeichers ausgelagert wenn du deinen Computer in den Standby modus versetzt.
Re: Lister - Programmidee
Verfasst: Donnerstag 25. April 2013, 08:54
von EyDu
xeike hat geschrieben:eine Lösung da heraus kann das simulieren einer fußgesteuerten Schleife sein:
Unnötige Variablen anlegen ist keine saubere Lösung. In diesem Fall ist ein break angebracht oder, wie von Sirius vorgeschlagen, eine Auslagerung in einen Generator.
Re: Lister - Programmidee
Verfasst: Donnerstag 25. April 2013, 10:04
von xeike
EyDu hat geschrieben:Unnötige Variablen anlegen ist keine saubere Lösung. In diesem Fall ist ein break angebracht oder, wie von Sirius vorgeschlagen, eine Auslagerung in einen Generator.
Mhh? Wenn ich mich entscheiden müsste, zwischen einer kleinen Variablen und dem Schreiben einer neuen Klasse würde ich auf "saubere Lösung" pfeifen.

Ich mag ja aus gutem Grund kein Java, das ist voll von so sauberen Lösungen, dass ich den Wald vor lauter Bäumen nicht mehr finde.
Ich persönlich würde aber bei dem gegebenen Problem das DRY-Prinzip verletzen, das ist für mich die beste Lösung, und alternativ die mit dem break.
Xe