实现了“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()