Python-对比参考目录查找多个文件夹中不同的文件

  改完文件名称后,Dr.he 发现分别保存5个状态的jpg 文件的文件夹出现缺少文件的情况。为了让他少熬夜查找缺失文件,结合网友分享的脚本,写了查找以下代码,满足他的需求,同时备忘。以下代码能解决实际需求,适合初学者。不足之处,欢迎指出修正!

写这篇文章前,以为方法和函数一样的,若同样有此困惑的网友可参考:https://www.cnblogs.com/mayugang/p/9977914.html

方法解析

standard_directory() 函数用于输入要检索的文件夹路径,共有5次机会,期间可以输入‘#’退出程序。路径要符合以下条件:

  1. 路径层级只能用正斜杠‘/’表示,不能包含反斜杠‘\’;
  2. 不能是文件路径;
  3. 文件夹目录不能包含文件;
  4. 其他的情况不允许的情况,例如路径不存在。

standard_file(folder_dir) 函数用于输入记录检索结果的文件路径,共有5次机会,期间可以输入‘#’退出程序。路径要符合以下条件:

  1. 路径层级只能用正斜杠‘/’表示,不能包含反斜杠‘\’;
  2. 不能是文件夹路径;
  3. 文件路径的上级目录不能是要检索的文件夹路径folder_dir;
  4. 输入不存在的文件路径:其上级目录不能是要检索的文件夹路径folder_dir,不能是不存在文件夹路径。

input_directory() 函数调用了standard_directory()、standard_file(folder_dir) ,输入文件夹和文件路径,分别返回这两个路径;

max_files_directory(src_directory) 函数根据文件夹路径查找文件名称是14个字符的文件数量最多的文件夹路径作为参考目录,就是这个文件夹为准,查找不在此文件夹中的文件。返回文件最多的文件夹目录

max_file_index、文件夹列表的大小file_folder_count、参考目录的文件列表max_file_folder_dir。

find_missing_file() 函数调用了input_directory()、max_files_directory(src_directory),查找目标目录的文件是否缺少参考目录的文件,记录下缺少的文件到结果文件中。

  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             if '.' in inp_path:
 63                 parent_path = os.path.dirname(inp_path)  # 获取文件的上级目录
 64                 if not os.path.exists(parent_path):  # 文件的上级目录不存在
 65                     print("输入文件的上级目录不存在\n")
 66                     pass_status = False
 67                 elif parent_path == folder_dir:  # 文件的上级目录不能是要检索的文件夹路径
 68                     print("记录结果的文件不能在要检索的文件夹路径中:{}".format(folder_dir))
 69                     pass_status = False
 70         else:
 71             # 若是文件则要判断,文件上级路径是否存在
 72             print("输入的文件路径存在未知")
 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 input_directory():
 82     src_path = standard_directory()
 83     print("\n")
 84     res_path = standard_file(src_path)
 85     return src_path, res_path
 86 
 87 
 88 def max_files_directory(src_directory):
 89     file_folders = os.listdir(src_directory)  # 文件夹名称列表
 90     file_folder_count = len(file_folders)  # 传参的文件夹中文件夹的数量
 91     file_num_list = []  # 定义文件数量列表,赋值空列表
 92     # 查找文件最多的目录(文件夹)作为参照目录
 93     for folder in file_folders:
 94         count = 0  # 记录文件名称是14个字符的文件数量
 95         file_list = os.listdir(src_directory + "/" + folder)  # 文件夹中的文件列表
 96         # 查找包括后缀名的文件名称是14个字符
 97         for file in file_list:
 98             if len(file) == 14:
 99                 count += 1  # 记录文件名称长度符合的文件数量
100         file_num_list.append(count)  # 将文件数量增加到件数量列表的后面
101         # file_num = len(file_list)       # 获取文件夹中的文件数量
102         # file_num_list.append(file_num)        # 将文件数量增加到件数量列表的后面
103         max_file_index = file_num_list.index(max(file_num_list))  # 查找文件列表中文件数量最大的索引
104     # 文件名符合条件的文件数量最多的文件夹是参照目录,其余文件夹的文件与参照目录的文件比较不同
105     max_file_folder_dir = src_directory + "/" + file_folders[max_file_index]
106     # 返回形参目录的文件最多的文件夹目录,文件夹列表的大小,参考目录的文件列表
107     return max_file_index, file_folder_count, max_file_folder_dir
108 
109 
110 # 查找目标目录的文件是否缺少参考目录的文件,记录下缺少的文件到结果文件中
111 def find_missing_file():
112     # 返回要对比文件夹目录、记录结果的文件路径
113     src_directory, log_path = input_directory()
114 
115     # 返回实参目录的文件最多的文件夹索引、实参目录的文件夹列表的大小,实参目录中参考目录
116     max_file_index, file_folder_count, max_file_folder_dir = max_files_directory(src_directory)
117     refer_file_names = os.listdir(max_file_folder_dir)  # 参照目录下的文件列表
118     print("\n输入的目录中文件最多的文件夹索引:{},输入的目录中文件夹列表的大小:{},作为参考的文件夹路径:{}\n参考目录的文件列表:{}\n"
119           .format(max_file_index, file_folder_count, max_file_folder_dir, refer_file_names))
120 
121     # 获取当前日期和时间,将时间转为字符串
122     now_time = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
123     # 以读/写 追加的模式打开文件
124     write_file = open(log_path, 'a+')
125     # 以追加的模式写入当前日期和时间
126     write_file.write(now_time + "\n")
127     # 以追加的模式写入参照目录
128     write_file.write("参考目录:" + max_file_folder_dir + "\n")
129     # 循环目录的文件列表
130     for i in range(file_folder_count):
131         # 当索引等于有最多文件的文件夹(参考文件夹)索引,跳出当前循环
132         if i == max_file_index:
133             print("第{}个文件夹是参考目录:{}".format(i + 1, os.listdir(src_directory)[i]))
134             continue
135 
136         count = 0  # 记录与参照文件夹的文件不同的数量
137         # 目的文件夹(非参考文件夹)的文件
138         target_path = src_directory + "/" + os.listdir(src_directory)[i]
139         target_file_names = os.listdir(target_path)
140         print("第{}个文件夹的路径{}\n文件夹的文件列表:{}\n".format(i + 1, target_path, target_file_names))
141 
142         for name in refer_file_names:
143             if len(name) == 14:
144                 if name not in target_file_names:
145                     write_file.write(name + "\n")  # 将在参照目录的文件却不在目的文件夹(非参照文件夹)的文件,写入文件
146                     count += 1  # 记录与参照文件夹的文件不同的数量
147         write_file.write(target_path + " 缺少的文件数目:" + str(count) + "\n\n")
148 
149     write_file.close()  # 关闭文件
150 
151 
152 # Python 内置的系统变量 __name__用于标识所在模块的模块名
153 # if __name__ == '__main__': 的作用是确保只有单独运行该模块时,此表达式才成立,才可以进入此判断语法,执行其中的测试代码
154 if __name__ == '__main__':
155     find_missing_file()
posted @ 2020-12-26 21:38  furichan  阅读(583)  评论(0编辑  收藏  举报