實現了“Python-對比參考目錄查找多個文件夾中不同的文件”, Dr.he 改需求了(好想一巴掌拍他到牆上):要以指定目錄爲參考,文件名稱都要存在於指定要檢索的文件夾的子文件夾中。於是在原代碼修改,以下代碼能解決實際需求,適合初學者。不足之處,歡迎指出修正!
1 # -*- coding:utf-8 -*- 2 import os 3 import datetime 4 5 """ 6 1、輸入參考文件夾的目錄A 7 2、輸入要對比參考文件夾的文件夾的父目錄B 8 3、輸入記錄結果文件的路徑C 9 4、以目錄A中的文件爲準,查找父目錄B的子目錄b1、b2……缺少的文件 10 """ 11 12 13 def search_directory(): 14 pass_status = False # 目錄輸入通過的狀態,初始不通過 15 inp_limit = 5 # 輸入限制次數 16 warn_str = "請輸入要檢索的文件夾完整路徑(如C:/Users/Default/Pictures),退出請按’#‘:" 17 for inp_count in range(inp_limit): 18 pass_status = True # 目錄輸入通過的狀態,布爾類型 19 inp_path = input("文件夾路徑輸入限制{}次,第{}次\n".format(inp_limit, inp_count + 1) + warn_str) 20 if '\\' in inp_path or '/' not in inp_path: 21 if inp_path == '#': 22 exit() # 退出程序 23 print("輸入的文件夾路徑格式有誤,路徑層級只能用正斜槓‘/’表示\n") 24 pass_status = False 25 elif os.path.isfile(inp_path): 26 print("輸入路徑是文件格式,路徑只能是文件夾的目錄\n") 27 pass_status = False 28 elif os.path.isdir(inp_path): 29 count = 0 # 記錄文件的數量 30 for folder in os.listdir(inp_path): 31 if '.' in folder: 32 count += 1 # 記錄文件的數量 33 if count > 0: 34 print("輸入的路徑中包含文件,路徑中只能有文件夾\n") 35 pass_status = False 36 # 當路徑不存在 37 else: 38 print("輸入文件夾路徑不存在或存在未知錯誤,請檢查\n") 39 pass_status = False 40 if pass_status: 41 return inp_path 42 if not pass_status: 43 print("{}次輸入檢索的文件夾路徑有誤,程序退出".format(inp_limit)) 44 exit() # 路徑輸入錯誤,退出程序 45 46 47 def refer_directory(): 48 pass_status = False # 目錄輸入通過的狀態,初始不通過 49 inp_limit = 5 # 輸入限制次數 50 warn_str = "請輸入參考文件夾完整路徑(如C:/Users/Default/Pictures),退出請按’#‘:" 51 for inp_count in range(inp_limit): 52 pass_status = True # 目錄輸入通過的狀態,布爾類型 53 inp_path = input("文件夾路徑輸入限制{}次,第{}次\n".format(inp_limit, inp_count + 1) + warn_str) 54 if '\\' in inp_path or '/' not in inp_path: 55 if inp_path == '#': 56 exit() # 退出程序 57 print("輸入的文件夾路徑格式有誤,路徑層級只能用正斜槓‘/’表示\n") 58 pass_status = False 59 elif os.path.isfile(inp_path): 60 print("輸入路徑是文件格式,路徑只能是文件夾的目錄\n") 61 pass_status = False 62 elif os.path.isdir(inp_path): 63 count = 0 # 記錄文件的數量 64 for folder in os.listdir(inp_path): 65 if '.' not in folder: 66 count += 1 # 記錄文件的數量 67 if count > 0: 68 print("輸入的路徑中不包含文件,不能作爲參考目錄") 69 pass_status = False 70 # 當路徑不存在 71 else: 72 print("輸入文件夾路徑不存在或存在未知錯誤,請檢查\n") 73 pass_status = False 74 if pass_status: 75 return inp_path 76 if not pass_status: 77 print("{}次輸入檢索的文件夾路徑有誤,程序退出".format(inp_limit)) 78 exit() # 路徑輸入錯誤,退出程序 79 80 81 def standard_file(folder_dir): 82 pass_status = False # 目錄輸入通過的狀態,初始不通過 83 inp_limit = 5 # 輸入限制次數 84 warn_str = "請輸入記錄結果的文件完整路徑(如C:/Users/Default/Pictures/log.txt),退出請按’#‘:" 85 for inp_count in range(inp_limit): 86 pass_status = True # 目錄輸入通過的狀態,布爾類型 87 inp_path = input("文件夾路徑輸入限制{}次,第{}次\n".format(inp_limit, inp_count + 1) + warn_str) 88 if '\\' in inp_path or '/' not in inp_path: 89 if inp_path == '#': 90 exit() # 退出程序 91 print("輸入的文件路徑格式有誤,路徑層級只能用正斜槓‘/’表示\n") 92 pass_status = False 93 elif os.path.isdir(inp_path): # 若輸入的是存在的文件夾路徑 94 print("輸入的文件路徑格式有誤,路徑是文件夾路徑\n") 95 pass_status = False 96 elif os.path.isfile(inp_path): 97 parent_path = os.path.dirname(inp_path) 98 if parent_path == folder_dir: 99 print("記錄結果的文件不能在要檢索的文件夾路徑中:{}\n".format(folder_dir)) 100 pass_status = False 101 continue 102 elif not os.path.exists(inp_path): # 若輸入的是不存在的文件或文件夾 103 # 若輸入的路徑包含逗號‘.’ 104 if '.' in inp_path: 105 parent_path = os.path.dirname(inp_path) # 獲取文件的上級目錄 106 if not os.path.exists(parent_path): # 文件的上級目錄不存在 107 print("輸入文件的上級目錄不存在\n") 108 pass_status = False 109 elif parent_path == folder_dir: # 文件的上級目錄不能是要檢索的文件夾路徑 110 print("記錄結果的文件不能在要檢索的文件夾路徑中:{}".format(folder_dir)) 111 pass_status = False 112 else: 113 # 若是文件則要判斷,文件上級路徑是否存在 114 print("輸入的文件路徑存在未知") 115 pass_status = False 116 if pass_status: 117 return inp_path 118 if not pass_status: 119 print("{}次輸入記錄結果的文件完整路徑有誤,程序退出".format(inp_limit)) 120 exit() # 路徑輸入錯誤,退出程序 121 122 123 def input_directory(): 124 refer_path = refer_directory() # 輸入參考文件夾目錄 125 src_path = search_directory() # 輸入要檢索的文件夾目錄 126 res_path = standard_file(src_path) # 輸入記錄結果的文件路徑,其上級目錄不能是要檢索的文件夾目錄 127 return refer_path, src_path, res_path # 返回參考文件夾目錄、要檢索的文件夾目錄、結果文件路徑 128 129 130 # 查找目標目錄的文件是否缺少參考目錄的文件,記錄下缺少的文件到txt文本中 131 def find_missing_file(): 132 refer_directory, src_directory, log_path = input_directory() # 循環進入要檢索目錄的文件夾 133 refer_files = os.listdir(refer_directory) # 參考目錄中的參考文件 134 src_folders = os.listdir(src_directory) # 要檢索目錄的文件夾列表 135 now_time = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S') # 獲取當前日期和時間,將時間轉爲字符串 136 write_file = open(log_path, 'a+') # 以讀/寫 追加的模式打開文件 137 write_file.write(now_time + "\n") # 以追加的模式寫入當前日期和時間 138 write_file.write("參考目錄:" + refer_directory + "\n") # 以追加的模式寫入參照目錄 139 for folder in src_folders: # 循環進入要檢索目錄的文件夾 140 count = 0 # 記錄與參考文件不同的數量 141 src_folder_dir = src_directory + "/" + folder # 要檢索目錄的子目錄路徑 142 if src_folder_dir == refer_directory: # 若參考文件夾目錄屬於要檢索文件夾目錄的子目錄,則跳出這一步的循環 143 continue 144 for refer_file in refer_files: # 遍歷參考目錄的文件 145 if len(refer_file) > 14: # 若參考文件名稱大小>14,則跳出此步循環 146 continue 147 if refer_file not in (os.listdir(src_folder_dir)): 148 print(refer_file + "\n") 149 write_file.write(refer_file + "\n") # 將在參照目錄的文件卻不在目的文件夾(非參照文件夾)的文件,寫入文件 150 count += 1 # 記錄與參照文件夾的文件不同的數量 151 print(src_folder_dir + " 缺少的文件數目:" + str(count) + "\n\n") 152 write_file.write(src_folder_dir + " 缺少的文件數目:" + str(count) + "\n\n") 153 154 write_file.close() # 關閉文件 155 156 157 # Python 內置的系統變量 __name__用於標識所在模塊的模塊名 158 # if __name__ == '__main__': 的作用是確保只有單獨運行該模塊時,此表達式才成立,纔可以進入此判斷語法,執行其中的測試代碼 159 if __name__ == '__main__': 160 find_missing_file()