美文网首页
用 Python 对比两个目录下的内容,并生成 Json 文件

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

作者: Wonz | 来源:发表于2020-09-04 19:13 被阅读0次

    一、背景

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

    image

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

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

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

    五、需要改进的地方

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

    六、参考

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

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

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

    相关文章

      网友评论

          本文标题:用 Python 对比两个目录下的内容,并生成 Json 文件

          本文链接:https://www.haomeiwen.com/subject/phrtektx.html