bin neu hier im Forum und neu bei python....
Ich habe mir mit dem E-Book "A Byte of Python" (www.byteofpython.info) einen kleinen Einblick in python verschafft.
Mein erstes Übungprogramm sucht in einem Verzeichnis nach doppelten Dateien und gibt diese aus. (Doppelte im Sinn von gleichem Inhalt und nicht gleichem Dateinamen..)
Ich wüsste gerne was ihr dazu meint und hoffe, dass ihr mir ein paar Verbesserungsvorschläge geben könntet.
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
#
"""
Dieses Programm sucht nach doppelten Dateien in einem bestimmtem Verzeichnis.
Zum erkennen, ob die Dateien gleich sind, wird md5sum -b benutzt
"""
import os, sys, commands
def search_doublettes(__dirname__):
'''
Sucht nach doppelten Dateien in einem Verzeichnis.
Die doppelten Files werden in einem Dictionary zurückgegeben.
'''
# Nach Dateien suchen und deren md5 Hash speichern
print 'Suche nach Dateien im Verzeichnis', __dirname__
str_path = 'find ' + __dirname__ + ' -type f -exec md5sum -b \{\} \;'
lines = commands.getoutput(str_path).split('\n')
print 'Suche abgeschlossen, starte Vergleich der Dateien.'
datei_dict = {} # Enthaelt die untersuchten Dateien
antwort_dict = {} # Enthaelt die doppelten Dateien
for line in lines:
hash = line.split(' ', 1)
hash[1] = hash[1].replace('\n', '').replace('*', '') # find fuegt dem Pfad ein * hinzu
# Wenn Hash noch nicht geprueft wurde --> zu datei_dicht hinzu fuegen
if datei_dict.has_key(hash[0]) == False:
datei_dict[hash[0]] = hash[1]
else:
# Diesen Hash gibt es schon! --> doppelte Datei
if antwort_dict.has_key(hash[0]):
antwort_dict[hash[0]].append(hash[1])
else:
antwort_dict[hash[0]] = [hash[1], datei_dict[hash[0]]]
return antwort_dict
if __name__ == "__main__":
# Zu pruefendes Verzeichnis einlesen
print 'Durchsucht ein Verzeichnis nach Doubletten (gleichen Dateien)\n'
try:
if os.path.isdir(sys.argv[1]) == True:
__dirname__ = str(sys.argv[1])
else: # Wenn der Parameter kein gültiges Verzeichnis war
__dirname__ = str(raw_input('Geben Sie das zu durchsuchende Verzeichnis an: '))
except: # Wenn kein Parameter übergeben wurde
__dirname__ = str(raw_input('Geben Sie das zu durchsuchende Verzeichnis an: '))
# Ueberpruefen, ob die Eingabe akzeptabel ist
if os.path.exists(__dirname__) != True or os.path.isdir(__dirname__) != True:
print 'Falsches Verzeichnis angegeben'
sys.exit(1)
# Wenn alles OK ist, Suche starten
antwort_dict = search_doublettes(__dirname__)
# Files ausgeben
if len(antwort_dict) > 0:
print '\nFolgende Dateien sind gleich:'
for key, files in antwort_dict.items():
print '\nHash:', key
for datei in files:
print '\t'+datei
else:
print '\nEs wurden keine doppelten Dateien gefunden.'
Code: Alles auswählen
fri@valhalla ~/Desktop $ ./search_doublettes.py ./
Durchsucht ein Verzeichnis nach Doubletten (gleichen Dateien)
Suche nach Dateien im Verzeichnis ./
Suche abgeschlossen, starte Vergleich der Dateien.
Folgende Dateien sind gleich:
Hash: 3034c746b8510aad871f0ec5dbae7817
./test_data/mesmerize_11.wav
./test_data/asdfasdf.wav
Hash: a753625175a456f23d56651064ab4a40
./test_data/123.MP3
./test_data/MANAU__6.MP3
Hash: 88f3f739fae32fbc3a5a3da68f782d94
./test_data/mesmerize_3 (Kopie).wav
./test_data/mesmerize_3 (noch eine Kopie).wav
./test_data/mesmerize_3.wav