改完文件名称后,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()

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

  1. python实现获取文件夹中的最新文件

    实现代码如下: #查找某目录中的最新文件import osclass FindNewFile: def find_NewFile(self,path): #获取文件夹中的所有文件 lists = os ...

  2. 基于Python——实现解压文件夹中的.zip文件

    [背景]当一个文件夹里存好好多.zip文件需要解压时,手动一个个解压再给文件重命名是一件很麻烦的事情,基于此,今天介绍一种使用python实现批量解压文件夹中的压缩文件并给文件重命名的方法—— [代码 ...

  3. python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件

    python操作txt文件中数据教程[3]-python读取文件夹中所有txt文件并将数据转为csv文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 python操作txt文件中 ...

  4. 文件夹中含有子文件夹,修改子文件夹中的图像存储格式(python实现)

    文件夹中含有子文件夹,修改子文件夹中的图像存储格式,把png图像改为jpg图像,python代码如下: import os import cv2 filePath = 'C:\\Users\\admi ...

  5. python 将指定文件夹中的指定文件放入指定文件夹中

    import os import shutil import re #获取指定文件中文件名 def get_filename(filetype): name =[] final_name_list = ...

  6. C++读取文件夹中所有的文件或者是特定后缀的文件

    由于经常有读取一个文件夹中的很多随机编号的文件,很多时候需要读取某些特定格式的所有文件. 下面的代码可以读取指定文件家中的所有文件和文件夹中格式为jpg的文件 参考: http://www.2cto. ...

  7. C#遍历指定文件夹中的所有文件(转)

    原文链接:http://www.cnblogs.com/qianqianfy/archive/2009/07/08/1518974.html 1. C#遍历指定文件夹中的所有文件 DirectoryI ...

  8. C#遍历指定文件夹中的所有文件(转)

    C#遍历指定文件夹中的所有文件 DirectoryInfo TheFolder=new DirectoryInfo(folderFullName);//遍历文件夹foreach(DirectoryIn ...

  9. [R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。

    解决的问题:需要读取某个大文件夹下所有子文件夹中的excel文件,并汇总,汇总文件中需要包含的2部分的信息:1.该条数据来源于哪个子文件夹:2.该条数据来源于哪个excel文件.最终,按照子文件夹单独 ...

  10. 2. 假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实 际数据。

    假设当前文件夹中data.csv文件中存放了2020年某饭店营业额,第一列为日期(如2020-02-03),第二列为每天交易额(如3560),文件中第一行为表头,其余行为实  际数据.编写程序,完成下 ...

随机推荐

  1. C语言常用的一些转换工具函数!

    1.字符串转十六进制 代码实现: 2.十六进制转字符串 代码实现: 或者 效果:十六进制:0x13 0xAA 0x02转为字符串:"13AAA2" 3.字符串转十进制 代码实现: ...

  2. 九. Vuex详解

    1. 理解Vuex 1.1 Vuex功能 官方解释 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用 集中式存储 管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方 ...

  3. 第8.29节 使用MethodType将Python __setattr__定义的实例方法与实例绑定

    一. 引言 在<第7.14节Python类中的实例方法解析>介绍了使用"实例对象名.方法名 = MethodType(函数, 对象)"将动态定义的方法与实例进行绑定 在 ...

  4. 第9.4节 Python中用readline读取二进制文件方式打开文件

    在<第9.3节 Python的文件内容读取:readline>中介绍了使用readline读取文件的处理,readline除了使用文本文件方式打开文件读外,也可以读取二进制方式打开的文件, ...

  5. PyQt(Python+Qt)学习随笔:QTreeWidget中标题相关属性访问方法headerItem、setHeaderLabels

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件窗口可以有一个标题头,其中包含部件中每个列的节(即标题).QTreeWidget的标题属性包 ...

  6. PyQt(Python+Qt)学习随笔:QTreeView树形视图的uniformRowHeights属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 uniformRowHeights属性用于控制视图中所有数据项是否保持相同高度,所有高度都与视图中第 ...

  7. FFmpeg在Android Studio中断点调试

    一般情况下在Android平台使用FFmpeg为动态库或静态库的形式,只能通过设置FFmpeg日志回调来看一些FFmpeg输出的日志,有时需要debug来查看FFmpeg内部执行过程,本文记录一下在A ...

  8. Jquery返回顶部插件

    自己jquery开发的返回顶部,当时只为了自己用一下,为了方便,修改成了插件... 自己的博客现在用的也是这个插件..使用方便!! <!DOCTYPE html> <html> ...

  9. 深入分析 Java、Kotlin、Go 的线程和协程

    前言 协程是什么 协程的好处 进程 进程是什么 进程组成 进程特征 线程 线程是什么 线程组成 任务调度 进程与线程的区别 线程的实现模型 一对一模型 多对一模型 多对多模型 线程的"并发& ...

  10. sqli-labs less5-6(双查询注入)

    less-5 双查询注入 利用count(), group by, floor(), rand()报错 双查询注入的原理参考博客 打开less-5 用union注入的流程进行发现页面不会有回显,所以u ...