2017-07-17 9 views
0

Wie kann ich diesen Python-Code verbessern? Ich möchte hier eine Liste hinzufügen, die alle Erweiterungen enthält, und mit Hilfe der Liste möchte ich nach dem Verzeichnis "src" für Erweiterungen suchen und sie zum Ziel verschieben.Python Verschieben von Dateien basierend auf Erweiterungen?

import shutil 
import glob 
import os 

dest_dir = "/home/xxxx/Software/" 
dest_dir2 = "/home/flyingpizza/Pictures/" 

for file in glob.glob(r'/home/xxxxx/Downloads/*.pdf'): 
    print (file) 
    shutil.move(file,dest_dir) 

for file in glob.glob(r'/home/xxxx/Downloads/*.docx'): 
    print(file) 
    shutil.move(file, dest_dir) 

for file in glob.glob(r'/home/xxxx/Downloads/*.exe'): 
    print(file) 
    shutil.move(file,dest_dir) 

for file in glob.glob(r'/home/xxxx/Downloads/*.jpg'): 
    print(file) 
    shutil.move(file,dest_dir2) 

for file in glob.glob(r'/home/xxxxx/Downloads/*.torrent'): 
    print(file) 
    os.remove(file) 
+1

Vielleicht fügen Sie 'von __future__ Import print_function' an der Spitze, so dass dieser Code funktioniert wirklich auf den markierten Python-2.7 ;-) – Dilettant

Antwort

1

Ich würde ein dict von Standorten und Erweiterungen, zB {'/home/xxx/Pictures': ['jpg','png','gif'], ...} Wo ich die „Schlüssel“ als Ziele und die Werte verwenden sind Listen von Erweiterungen für jedes Ziel.

source = '/home/xxx/randomdir/' 
mydict = { 
    '/home/xxx/Pictures': ['jpg','png','gif'], 
    '/home/xxx/Documents': ['doc','docx','pdf','xls'] 
} 
for destination, extensions in mydict.items(): 
    for ext in extensions: 
     for file in glob.glob(source + '*.' + ext): 
      print(file) 
      shutil.move(file, destination) 

Während Fabre-Lösung gut ist, würde man seine Doppel-Loop-Lösung für jeden Zielordner wiederholen müssen, während hier Sie ein Triple-Loop haben, der alles tut, so lange wie Sie es eine richtige dict

geben

Auch ein Wort des Rates, wenn Sie Code schreiben, der so repetitiv aussieht, wie Sie, ist sicher, dass es einen Weg gibt, es einfacher zu machen, entweder mit einer Schleife oder einer Funktion, die Argumente nimmt.

+0

Danke für die Hilfe, die funktioniert! Ich habe "os.replace (Datei, Ziel)" in Ihrem Code hinzugefügt, um eine vorhandene Datei zu ersetzen. –

1

mit einem Doppel-Loop und erzeugen das Muster unter Verwendung format:

for ext in ["docx","pdf","exe","jpg"]: 
    for file in glob.glob('/home/xxxxx/Downloads/*.{}'.format(ext)): 
     print (file) 
     shutil.move(file,dest_dir) 
1

Eine andere erweiterbare Lösung

import os 
import shutil 

dir1 = "/home/xxxx/Software/" 
dir2 = "/home/flyingpizza/Pictures/" 

def moveto(dst): 
    return lambda src: shutil.move(src, dst) 

action = { 
    'pdf': moveto(dir1), 
    'docx': moveto(dir1), 
    'exe': moveto(dir1), 
    'jpg': moveto(dir2), 
    'torrent': os.remove, 
} 

src_dir = '/home/xxxxx/Downloads' 
for file in os.listdir(src_dir): 
    ext = os.path.splitext(file)[1][1:] 
    if ext in action: 
     action[ext](os.path.join(src_dir, file)) 
Verwandte Themen