python 遍历目录生成json_用 Python 对比两个目录下的内容,并生成 Json 文件

一、背景

两个文件夹下,可能有相同名字的文件,也可能有不同名字的文件,相同名字的文件也有可能内容不同,因此需要对比,将结果输出到 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}

五、需要改进的地方

只考虑文件目录一层结构,如果目录下面还有二级目录,怎么继续判断二级目录下的内容是否相同?

是否可以同步更新两个目录下的内容,保证一致性?

六、参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值