2017-08-05 99 views
0

因此,我有一个程序可以抓取我的电影集合,但我试图将其自动化。我的目的是搜索每个文件夹并查找“.mkv”文件,如果发现它移动到根文件夹,则删除原始文件夹。用扩展名将文件移动到根文件夹使用Python

我已经得到这个工作,它的运作,但我很好奇,它可以写得更好。有没有办法基本上做这个伪代码?

loop each folder: 
    if folder has files: 
    if file extention is '.mkv': 
     move file to '/media/movies/' 

的文件夹结构是

C:/Users/Matthew/Desktop/New folder (2) 
    - Test Movie 
     ~ Test_Movie_t00.mkv 
    - Alpha Movie 
     ~ Alpha_Movie_t200.mkv 
    - Greatest Movie Ever 
     ~ Greatest_Movie_Ever_t100.mkv 
    ~ Good Format Movie.mkv 
    ~ Stackoverflow the Movie.mkv 

这里是我的代码工作。

import os 
import re 

print("Running Cleaner\n") 
directory = 'C:/Users/Matthew/Desktop/New folder (2)' 
directorylength=len(directory)+1 
folders = [] 
movies = [] 
for root, dirs, files in os.walk(directory, topdown=False): 
    for name in dirs: 
     #print(os.path.join(root, name)[strlength:]) 
     folders.append(os.path.join(root, name)[directorylength:]) 
for folder in folders: 
    for file in os.listdir(directory + "/" + folder): 
     if file.endswith(".mkv"):  
      #print(os.path.join(folder, file)) 
      movies.append(os.path.join(folder, file)[len(folder)+1:]) 
for folder in folders: 
    for movie in movies: 
     if os.path.exists(directory + "/" + folder + "/" + movie): 
      file=folder + "/" + movie 
      print("Found: " + file) 
      newFile = re.sub('_t\d{2,}.mkv',".mkv",file) 
      newFile = re.sub('_',' ',newFile) 
      newFile = newFile[len(folder)+1:] 
      print("Renaming to: " + newFile) 
      os.rename(directory + "/" + file, directory + "/" + newFile) 
    print("Removing empty folder: " + folder) 
    os.rmdir(directory + "/" +folder) 
print("\nFinished Cleaning up!") 
+0

您是否尝试过使用水珠? – liorko

+1

添加到https://codereview.stackexchange.com这有助于您获得更好的建议 –

回答

0
  1. 保持扩展映射到目标路径

    mapping = {'mkv' : '/media/movies/', ... } 
    

    关于这个的好处是,在未来多扩展的支持。

  2. 检查扩展的分裂与os.path.splitext

  3. 使用shutil.move,您可以指定目的地为目录。这简化了事情

  4. if not os.listdir检查目录是否为空。否则,错误将被抛出(如果该目录不为空)


mapping = {'mkv' : '/media/movies/', ... } 
for root, dirs, files in os.walk(directory, topdown=False): 
    for file in files: 
     fullpath = os.path.join(root, file) 
     _, ext = os.path.splitext(fullpath) 
     if ext in mapping: 
      shutil.move(fullpath, mapping[ext]) 

    for dir in dirs: 
     fullpath = os.path.join(root, dir) 
     if not os.listdir(fullpath): 
      os.rmdir(fullpath) 
相关问题