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

四、结果

test1test2 两个文件夹下的内容如下图所示:

其中,0.py 文件里面内容都一样,1.py 文件里面内容不相同,2.txt 只有单独的一个。

运行此程序前需要在程序所在目录下新建一个 test_data.json 文件,然后运行程序,打开 json 文件,可以查看到以下内容:

{"0.py": true, "1.py": false, "2.txt": false}

五、需要改进的地方

  • 只考虑文件目录一层结构,如果目录下面还有二级目录,怎么继续判断二级目录下的内容是否相同?
  • 是否可以同步更新两个目录下的内容,保证一致性?

六、参考

Python判断两个文件是否相同与两个文本进行相同项筛选的方法

Python对象转换为json的方法步骤

【Python】字典内容写入json文件

全部评论

相关推荐

群星之怒:1.照片可以换更好一点的,可以适量P图,带一些发型,遮住额头,最好穿的正式一点,可以适当P图。2.内容太少。建议添加的:求职意向(随着投递岗位动态更改);项目经历(内容太少了建议添加一些说明,技术栈:用到了什么技术,还有你是怎么实现的,比如如何确保数据传输稳定的,角色注册用到了什么技术等等。)项目经历是大头,没有实习是硬伤,如果项目经理不突出的话基本很难过简历筛。3.有些内容不必要,比如自我评价,校内实践。如果实践和工作无关千万别写,不如多丰富丰富项目。4.排版建议:建议排版是先基础信息,然后教育背景(要突出和工作相关的课程),然后专业技能(一定要简短,不要长篇大论,写你会什么,会的程度就可以),然后是项目经历(一定要详细,占整个简历一定要超过一半,甚至超过百分之70都可以)。最后如果有一部分空白的话可以填补上校内获得的专业相关的奖项,没有就写点校园经历和自我评价。5.技术一定要够硬,禁得住拷打。还有作息尽量保证正常,不要太焦虑。我24双非本科还是非科班,秋招春招各找了一段实习结果都没有转正,当时都想噶了,最后6月份在校的尾巴也找到一份工作干到现在,找工作有时很看运气的不要急着自我否定。 加油
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务