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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章