Python-對比參考目錄查找多個文件夾中不同的文件

  改完文件名稱後,Dr.he 發現分別保存5個狀態的jpg 文件的文件夾出現缺少文件的情況。為了讓他少熬夜查找缺失文件,結合網友分享的腳本,寫了查找以下程式碼,滿足他的需求,也以防自己忘記。以下程式碼能解決實際需求,適合初學者。不足之處,歡迎指出修正!

 

  1 import os
  2 import datetime
  3 
  4 
  5 def standard_directory():
  6     pass_status = False     # 目錄輸入通過的狀態,初始不通過
  7     inp_limit = 5       # 輸入限制次數
  8     warn_str = "請輸入要檢索的文件夾完整路徑(如C:/Users/Default/Pictures),退出請按』#『:"
  9     for inp_count in range(inp_limit):
 10         pass_status = True      # 目錄輸入通過的狀態,布爾類型
 11         inp_path = input("文件夾路徑輸入限制{}次,第{}次\n".format(inp_limit,inp_count+1)+warn_str)
 12         if '\\' in inp_path or '/' not in inp_path:
 13             if inp_path == '#':
 14                 exit()  # 退出程式
 15             print("輸入的文件夾路徑格式有誤,路徑層級只能用正斜杠『/』表示\n")
 16             pass_status = False
 17         elif os.path.isfile(inp_path):
 18             print("輸入路徑是文件格式,路徑只能是文件夾的目錄\n")
 19             pass_status = False
 20         elif os.path.isdir(inp_path):
 21             count = 0       # 記錄文件的數量
 22             for folder in os.listdir(inp_path):
 23                 if '.' in folder:
 24                     count += 1      # 記錄文件的數量
 25             if count > 0:
 26                 print("輸入的路徑中包含文件,路徑中只能有文件夾\n")
 27                 pass_status = False
 28         # 當路徑不存在
 29         else:
 30             print("輸入文件夾路徑不存在或存在未知錯誤,請檢查\n")
 31             pass_status = False
 32         if pass_status:
 33             return inp_path
 34     if not pass_status:
 35         print("{}次輸入檢索的文件夾路徑有誤,程式退出".format(inp_limit))
 36         exit()          # 路徑輸入錯誤,退出程式
 37 
 38 
 39 def standard_file(folder_dir):
 40     pass_status = False     # 目錄輸入通過的狀態,初始不通過
 41     inp_limit = 5       # 輸入限制次數
 42     warn_str = "請輸入記錄結果的文件完整路徑(如C:/Users/Default/Pictures/log.txt),退出請按』#『:"
 43     for inp_count in range(inp_limit):
 44         pass_status = True      # 目錄輸入通過的狀態,布爾類型
 45         inp_path = input("文件夾路徑輸入限制{}次,第{}次\n".format(inp_limit,inp_count+1)+warn_str)
 46         if '\\' in inp_path or '/' not in inp_path:
 47             if inp_path == '#':
 48                 exit()  # 退出程式
 49             print("輸入的文件路徑格式有誤,路徑層級只能用正斜杠『/』表示\n")
 50             pass_status = False
 51         elif os.path.isdir(inp_path):       # 若輸入的是存在的文件夾路徑
 52             print("輸入的文件路徑格式有誤,路徑是文件夾路徑\n")
 53             pass_status = False
 54         elif os.path.isfile(inp_path):
 55             parent_path = os.path.dirname(inp_path)
 56             if parent_path == folder_dir:
 57                 print("記錄結果的文件不能在要檢索的文件夾路徑中:{}\n".format(folder_dir))
 58                 pass_status = False
 59                 continue
 60         elif not os.path.exists(inp_path):  # 若輸入的是不存在的文件或文件夾
 61             # 若是文件路徑,上一級記錄是文件夾是存在
 62             path_list = inp_path.split('\n')
 63             for sub_path in path_list:
 64                 if '.' in sub_path:
 65                     parent_path = os.path.dirname(sub_path)       # 獲取文件的上級目錄
 66                     if not os.path.exists(parent_path):         # 文件的上級目錄不存在
 67                         print("輸入文件的上級目錄不存在\n")
 68                         pass_status = False
 69                     elif parent_path == folder_dir:     # 文件的上級目錄不能是要檢索的文件夾路徑
 70                         print("記錄結果的文件不能在要檢索的文件夾路徑中:{}".format(folder_dir))
 71                         pass_status = False
 72                         continue
 73                 else:
 74                     print("輸入的目錄不存在\n")
 75                     pass_status = False
 76         else:
 77             # 若是文件則要判斷,文件上級路徑是否存在
 78             print("輸入的文件路徑存在未知")
 79             pass_status = False
 80         if pass_status:
 81             return inp_path
 82     if not pass_status:
 83         print("{}次輸入記錄結果的文件完整路徑有誤,程式退出".format(inp_limit))
 84         exit()          # 路徑輸入錯誤,退出程式
 85 
 86 
 87 def input_directory():
 88     src_path = standard_directory()
 89     print("\n")
 90     res_path = standard_file(src_path)
 91     return src_path, res_path
 92 
 93 
 94 def max_files_directory(src_directory):
 95     file_folders = os.listdir(src_directory)        # 文件夾名稱列表
 96     file_folder_count = len(file_folders)       # 傳參的文件夾中文件夾的數量
 97     file_num_list = []        # 定義文件數量列表,賦值空列表
 98     # 查找文件最多的目錄(文件夾)作為參照目錄
 99     for folder in file_folders:
100         count = 0       # 記錄文件名稱是14個字元的文件數量
101         file_list = os.listdir(src_directory + "/" + folder)    # 文件夾中的文件列表
102         # 查找包括後綴名的文件名稱是14個字元
103         for file in file_list:
104             if len(file) == 14:
105                 count += 1      # 記錄文件名稱長度符合的文件數量
106         file_num_list.append(count)        # 將文件數量增加到件數量列表的後面
107         # file_num = len(file_list)       # 獲取文件夾中的文件數量
108         # file_num_list.append(file_num)        # 將文件數量增加到件數量列表的後面
109         max_file_index = file_num_list.index(max(file_num_list))     # 查找文件列表中文件數量最大的索引
110     # 文件名符合條件的文件數量最多的文件夾是參照目錄,其餘文件夾的文件與參照目錄的文件比較不同
111     max_file_folder_dir = src_directory + "/" + file_folders[max_file_index]
112     # 返回形參目錄的文件最多的文件夾目錄,文件夾列表的大小,參考目錄的文件列表
113     return max_file_index, file_folder_count, max_file_folder_dir
114 
115 
116 # 查找目標目錄的文件是否缺少參考目錄的文件,記錄下缺少的文件到txt文本中
117 def find_missing_file():
118     # 返回要對比文件夾目錄、記錄結果的文件路徑
119     src_directory, log_path = input_directory()
120 
121     # 返回實參目錄的文件最多的文件夾索引、實參目錄的文件夾列表的大小,實參目錄中參考目錄
122     max_file_index, file_folder_count, max_file_folder_dir = max_files_directory(src_directory)
123     refer_file_names = os.listdir(max_file_folder_dir)  # 參照目錄下的文件列表
124     print("\n輸入的目錄中文件最多的文件夾索引:{},輸入的目錄中文件夾列表的大小:{},作為參考的文件夾路徑:{}\n參考目錄的文件列表:{}\n"
125           .format(max_file_index, file_folder_count, max_file_folder_dir,refer_file_names))
126 
127     # 獲取當前日期和時間,將時間轉為字元串
128     now_time = datetime.datetime.strftime(datetime.datetime.now(),'%Y-%m-%d %H:%M:%S')
129     # 以讀/寫 追加的模式打開文件
130     write_file = open(log_path, 'a+')
131     # 以追加的模式寫入當前日期和時間
132     write_file.write(now_time + "\n")
133     # 以追加的模式寫入參照目錄
134     write_file.write("參考目錄:" + max_file_folder_dir + "\n")
135     # 循環目錄的文件列表
136     for i in range(file_folder_count):
137         # 當索引等於有最多文件的文件夾(參考文件夾)索引,跳出當前循環
138         if i == max_file_index:
139             print("第{}個文件夾是參考目錄:{}".format(i + 1, os.listdir(src_directory)[i]))
140             continue
141 
142         count = 0       # 記錄與參照文件夾的文件不同的數量
143         # 目的文件夾(非參考文件夾)的文件
144         target_path = src_directory + "/" + os.listdir(src_directory)[i]
145         target_file_names = os.listdir(target_path)
146         print("第{}個文件夾的路徑{}\n文件夾的文件列表:{}\n".format(i+1, target_path, target_file_names))
147 
148         for name in refer_file_names:
149             if len(name) == 14:
150                 if name not in target_file_names:
151                     write_file.write(name + "\n")       # 將在參照目錄的文件卻不在目的文件夾(非參照文件夾)的文件,寫入文件
152                     count += 1      # 記錄與參照文件夾的文件不同的數量
153         write_file.write(target_path + " 缺少的文件數目:" + str(count) + "\n\n")
154 
155     write_file.close()      # 關閉文件
156 
157 
158 # Python 內置的系統變數 __name__用於標識所在模組的模組名
159 # if __name__ == '__main__': 的作用是確保只有單獨運行該模組時,此表達式才成立,才可以進入此判斷語法,執行其中的測試程式碼
160 if __name__ == '__main__':
161     find_missing_file()

 

Tags: