【问题标题】:how to compare two directories and output the changed file in python如何比较两个目录并在python中输出更改的文件
【发布时间】:2018-07-18 06:49:51
【问题描述】:

我在 Linux 中有两个目录,其中有两个文件。我需要比较这两个目录并打印出更改的文件。

folder1:
  file1.txt   file2.txt

folder2:
  file1.txt   file2.txt

我需要比较folder1folder2 并打印出这两个目录中不同的文件名。我想首先使用ls 命令获取文件列表并将它们放在list 中,然后使用python 的filecmp 比较它们,如下所示:

import os
import filecmp

folder1_path = "/home/user/folder1/"
folder2_path = "/home/user/folder2/"

def ls(path):
   all = []
   walked = os.walk(path)
   for base, sub_f, files in walked:           
       for sub in sub_f:           
            entry = os.path.join(base,sub)
            entry = entry[len(path):].strip("\\")
            all.append(entry)

       for file in files:          
           entry = os.path.join(base,file)
           entry = entry[len(path):].strip("\\")
           all.append(entry)
    all.sort()
    return all

def folder_diff(folder1_path, folder2_path):
    folder1_list = ls(folder1_path)
    folder2_list = ls(folder2_path)

    for item1, item2 in zip(folder1_list, folder2_list):
        res = filecmp.cmp(folder1_path + item1, folder2_path + item2)

data = folder_diff(folder1_path, folder2_path)
print(data)

当两个文件夹中都存在文件时,这会引发错误FileNotFound。任何人都可以请提出任何更新。谢谢

【问题讨论】:

  • 函数folder_diff中,folder1_list中存储的内容是什么,只是文件名或文件名的完整文件路径,因为python需要完整的文件路径才能访问文件
  • @SuryaTej 谢谢苏里亚。是的,这是错误的。我现在已经给出了完整的路径,它正在工作。
  • @SuryaTej。请再次查看代码并进行审核

标签: python compare


【解决方案1】:

为了只有一个功能,你可以使用这个:

def folder_diff():
    folder1 = os.listdir(PATH1) # folder containing your files
    folder2 = os.listdir(PATH2) # the other folder

    for item1 in folder1:
        for item2 in folder2:
            if(item1==item2):
                res = filecmp.cmp(PATH1+item1, PATH2+item2)

if __name__ == "__main__":
import os
import filecmp
PATH1 = ''
PATH2 = ''
data = folder_diff()
print(data)

【讨论】:

  • 感谢os.listdir。我对此只有 1 个问题。我有file1.txtfile2.txt。我想将文件夹 1 的 file1.txt 与文件夹 2 的 file1.txt 和文件 2 进行比较。它会导致这个folder1 = ['file1.txt', 'file2.txt']folder2 = ['file1.txt', 'file2.txt'] 总是而不是folder1 = ['file1.txt', 'file2.txt']folder2 = ['file2.txt', 'file1.txt'] 这样我就不会比较file1 和file2
  • @SAndrew:如果文件名改变了,你怎么知道要比较哪些文件。答案if item1==item2,为什么首先需要再次比较?
  • @Mechanic 文件名不会改变,我只想比较 file1 和 file1。
  • 好的。我以为你想比较文件名(而不是文件)
【解决方案2】:

您也可以使用glob 模块完成此操作

import os
import glob
import filecmp

comparison = []
for each in glob.glob('home/user/folder1/**'):
    for each1 in glob.glob('home/user/folder2/**'):
        if os.path.basename(each) == os.path.basename(each1):
            comparison.append(filecmp.cmp(each, each1))

print(comparison)

【讨论】:

  • 您可以只使用os.path.exists,而不是为folder1 中的每个文件循环遍历整个folder2 以确定它是否也存在于folder2 中。这样你就不需要嵌套循环,如果两个文件夹都包含很多文件,你可能会显着加快程序速度。
  • 我为您的建议尝试了 pathlib 版本,Path('somepath').exists(),它比执行两个循环快几个数量级。感谢您的评论。
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
相关资源
最近更新 更多