1. 程式人生 > 實用技巧 >Python-指定參考目錄,查詢資料夾缺少的檔案

Python-指定參考目錄,查詢資料夾缺少的檔案

  實現了“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()