一、背景
两个文件夹下,可能有相同名字的文件,也可能有不同名字的文件,相同名字的文件也有可能内容不同,因此需要对比,将结果输出到 Json 文件。
二、思路
先获取两个目录,然后分别遍历目录下的所有文件,将文件名加入文件列表,字符串拼接成新的文件路径,加入路径列表。
然后分别打开文件,通过计算文件哈希值来对比文件是否相同,将结果先存到字典中。因为两个目录下文件数量可能不同,因此需要考虑如果某个目录下的文件数多于另一个目录的文件数,那么必定是不相同,需要单独存到字典中。
最后,将字典里的内容输出到 Json 文件。
三、代码
import hashlib import os import json dic = {} def getHash(f): """ 获取文件哈希值 f:文件 """ line = f.readline() hash = hashlib.md5() while(line): hash.update(line) line = f.readline() return hash.hexdigest() def IsHashEqual(f1,f2): """ 比较哈希值是否相同 f1:第一个文件 f2:第二个文件 """ str1 = getHash(f1) str2 = getHash(f2) return str1 == str2 def CountFiles(path1, path2): """ 比较文件 """ path_1, path_2 = [], [] file_dir1, file_dir2 = [], [] # 获取 path1 路径下的所有文件 for file in os.listdir(path1): file_dir1.append(file) # print(file) tmp_path1 = path1 + str(file) # print(path1) path_1.append(tmp_path1) # 获取 path2 路径下的所有文件 for file in os.listdir(path2): file_dir2.append(file) # print(file) tmp_path2 = path2 + str(file) # print(path2) path_2.append(tmp_path2) len1, len2 = len(path_1), len(path_2) for i in range(min(len1, len2)): file1 = open(path_1[i], "rb") file2 = open(path_2[i], "rb") res = IsHashEqual(file1, file2) dic[file_dir1[i]] = res # print(dic) # 两个路径下的文件数量不同 if len1 < len2: for i in range(len1, len2): dic[file_dir2[i]] = False elif len1 > len2: for i in range(len2, len1): dic[file_dir1[i]] = False # 写入 json 文件 js = json.dumps(dic) with open('test_data.json', 'w') as json_file: json_file.write(js) if __name__ == '__main__': # f1 = open("D:/Code/Python/test1/0.py","rb") # f2 = open("D:/Code/Python/test2/0.py","rb") # print(IsHashEqual(f1,f2)) path1 = "D:/Code/Python/test1/" path2 = "D:/Code/Python/test2/" CountFiles(path1, path2) print(dic)
四、结果
test1
和 test2
两个文件夹下的内容如下图所示:
其中,0.py
文件里面内容都一样,1.py
文件里面内容不相同,2.txt
只有单独的一个。
运行此程序前需要在程序所在目录下新建一个 test_data.json
文件,然后运行程序,打开 json 文件,可以查看到以下内容:
{"0.py": true, "1.py": false, "2.txt": false}
五、需要改进的地方
- 只考虑文件目录一层结构,如果目录下面还有二级目录,怎么继续判断二级目录下的内容是否相同?
- 是否可以同步更新两个目录下的内容,保证一致性?