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

 

posted @ 2021-01-01 12:51  furichan  阅读(436)  评论(0编辑  收藏  举报