2017-07-17 85 views
0

我該如何改進這個python代碼。我想在這裏添加一個包含所有擴展名的列表,並且在列表的幫助下,我想搜索「src」擴展名目錄並將它們移動到目的地。基於擴展名的python移動文件?

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

也許加上'從頂部__future__進口print_function',所以這段代碼確實有效的標記中的python-2.7 ;-) – Dilettant

回答

1

我在哪裏使用「密鑰」目的地和所述值I會使用的位置和擴展的字典,例如{'/home/xxx/Pictures': ['jpg','png','gif'], ...}是每個目的地的分機列表。

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) 

雖然法布爾的解決方案是好的,你將不得不重複他的每一個目標文件夾雙迴路解決方案,而在這裏你有三環路,做一切,只要你給它一個合適的dict

另外一個建議的話,如果你編寫看起來如此重複的代碼,就像你的代碼一樣,確保有一種方法可以使它更簡單,無論是循環還是帶有參數的函數。

+0

感謝您的工作的幫助!我在代碼中添加了「os.replace(file,destination)」來替換現有的文件。 –

1

具有雙迴路,並生成使用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

另一種擴展的解決方案

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))