比较同一文件夹的两个版本,得到不同的文件名

2024-04-26 09:45:03 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下简化的文件结构

main_folder
    |__ foo.json
    |
    |__ sub_folder
          |__bar.json

我有两份main_folder,例如main_folder_v1和{}

我想比较两个版本并得到所有不同文件的名称(例如,get "foo.json",以防其内容在main_folder_v2中更新)

我用下面的代码

^{pr2}$

问题是我将得到["foo.json"],以防它在main_folder_v2中被更新,但我永远不会得到{},因为似乎没有对{}中的文件进行比较

有没有可能使用filecmp递归地比较文件夹并获得不同的文件名,或者os.walk()是唯一的解决方案吗?在


Tags: 文件代码版本名称json内容getfoo
1条回答
网友
1楼 · 发布于 2024-04-26 09:45:03

[Python]: filecmp - File and Directory Comparisons支持通过dircmp.subdirs进行递归遍历。{cd2>不需要其它函数。在

代码.py

import sys
import filecmp
import os


main_folder_v1 = "dir_v1"
main_folder_v2 = "dir_v2"

ROOT_DIR_MARKER = ""


def traverse_dircmp(dircmp_obj, dir_name=ROOT_DIR_MARKER):
    for item in dircmp_obj.diff_files:
        yield os.path.join(dir_name, item)
    for subdir_name in dircmp_obj.subdirs:
        yield from traverse_dircmp(dircmp_obj.subdirs[subdir_name], dir_name=os.path.join(dir_name, subdir_name))
        #for item in traverse_dircmp(dircmp_obj.subdirs[subdir_name], dir_name=os.path.join(dir_name, subdir_name)):
        #    yield item


def traverse_dircmp_list(dircmp_obj, dir_name=ROOT_DIR_MARKER):
    ret = [os.path.join(dir_name, item) for item in dircmp_obj.diff_files]
    for subdir_name in dircmp_obj.subdirs:
        ret.extend(traverse_dircmp_list(dircmp_obj.subdirs[subdir_name], dir_name=os.path.join(dir_name, subdir_name)))
    return ret


def main():
    comparison_object = filecmp.dircmp(main_folder_v1, main_folder_v2)

    comparison_result = traverse_dircmp(comparison_object)
    print("{:s}: {:}".format("Different files (gen)", list(comparison_result)))

    comparison_result_list = traverse_dircmp_list(comparison_object)
    print("{:s}: {:}".format("Different files (list)", comparison_result_list))


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

输出(对于与您类似的dir结构):

(py35x64_test) e:\Work\Dev\StackOverflow\q050157870>"e:\Work\Dev\VEnvs\py35x64_test\Scripts\python.exe" code.py
Python 3.5.4 (v3.5.4:3f56838, Aug  8 2017, 02:17:05) [MSC v.1900 64 bit (AMD64)] on win32

Different files (gen): ['foo.json', 'subdir00\\bar.json', 'subdir00\\subdir001\\x.json']
Different files (list): ['foo.json', 'subdir00\\bar.json', 'subdir00\\subdir001\\x.json']

@EDIT0

  • 修改了traverse_dircmp函数以返回文件列表,而不是按其中一条注释中的要求打印它们

@EDIT1

  • 添加了generator功能(作为个人练习),这是新的(也是首选的)样式,在出现大量dir时不会消耗内存(!!需要Python3.3或更高版本!!,或者yield from语句可以替换为它下面的2个注释(foryield)行)

相关问题 更多 >