比较 2 个文件夹中的同名文件并检查它们的大小以删除 Python 中较大的文件

compare files with same name in 2 folders and check their size to delete the bigger one in Python

你好,我正在清理我的电脑,所以我发现自己向 Handbrake 提供了大量文件以进行压缩。压缩后,一些文件的大小比原来的大。我想清理它,所以我尝试制作一个小 python 脚本。

基本上我有 2 个文件夹,其中的文件名称相同但大小不同,我想比较文件以删除较大的文件,因此如果我合并文件夹,我将只保存较小的文件。

我以我拥有的文件夹为例

- test/Original
 file1.mpg 40Mb
 file2.mpg 2Mb
 file3.mpg 400Mb
 file4.mpg 45Mb

- test/Compressed
 file1.mpg 20Mb
 file2.mpg 2Mb
 file3.mpg 200Mb
 file4.mpg 105Mb

在脚本的末尾,我想要这个(或合并的第三个文件夹)

- test/Original
 file4.mpg 45Mb

- test/Compressed
 file1.mpg 20Mb
 file2.mpg 2Mb
 file3.mpg 200Mb
 file4.mpg 105Mb

我写了这段代码,它似乎可以工作,但我想知道是否有更好的方法,我听说过一个函数文件比较,但我不明白我是否可以从它。

另外我不明白为什么如果我删除注释行的注释,我会收到缩进错误。

import os

dirA = 'test/a'
dirB = 'test/b'
merged = []

with os.scandir(dirA) as it:
    for entry in it:
        if entry.is_file():
            merged.append(entry)

with os.scandir(dirB) as it:
    for entry in it:
        if entry.is_file():
            merged.append(entry)


for i in range(len(merged)):
#   print('-------------iterating over %s' % (merged[i].name,merged[i].stat().st_size/1024**2))
    for j in range(i + 1, len(merged)):
        if str(merged[i].name) == str(merged[j].name):
            print('----DUPLICATE %s %.2f Mb = %s %.2f Mb' % (merged[i].name, merged[i].stat().st_size/1024**2, merged[j].name, merged[j].stat().st_size/1024**2))
            if merged[i].stat().st_size >= merged[j].stat().st_size:
                print('removing %s %.2f Mb' % (merged[i].name, merged[i].stat().st_size/1024**2))
                os.remove(merged[i])
            elif merged[i].stat().st_size < merged[j].stat().st_size:
                print('removing %s %.2f Mb' % (merged[j].name, merged[j].stat().st_size/1024**2))
                os.remove(merged[j])

根据大小删除文件

这是一个简单的过程,可以在一个函数中实现。

def  compare_folders(path1, path2):
    ignore = [".", "..", ".DS_Store"] # ignore these pointers/ files
    for  file  in  os.listdir(path1):
        if  file  in  os.listdir(path2):
            if  file  not  in  ignore:
                delete_larger_file(path1 + "/" + file, path2 + "/" + file)

  
def  merge_folders(path1, path2):
    for  file  in  os.listdir(path1):
        if  file  not  in  os.listdir(path2):
            os.rename(path1 + "/" + file, path2 + "/" + file)

def  delete_larger_file(path1, path2):
    if  os.path.getsize(path1) > os.path.getsize(path2):
        os.remove(path1)
    else:
        os.remove(path2)

这是怎么回事?

  • 第一个函数 compare_folders() 将获取要比较的文件夹的路径作为输入。然后它将遍历每个文件夹的内容并调用另一个函数 delete_larger_file() 比较 2 个文件的大小并删除较大的一个。
  • 必须随后调用 merge_folders() 才能将文件夹合并到位。换句话说,它将比较两个文件夹的内容并将不在一个文件夹中的文件移动到另一个文件夹。最后,一个文件夹应该是空的,另一个应该有所有最小的文件。
  • 请注意:此操作无法撤消,所以可以先测试一下吗?此外,如果有子文件夹,这将不起作用,需要递归。

先调用compare_folders()再调用merge_folders

i post 完整代码,以防万一有人需要它,感谢@drow339!!!!

import os

path1 = 'test1/a'
path2 = 'test1/b'

print('Comparing the folders: %s and %s' % (path1, path2))


def compare_folders(path1, path2):
    ignore = [".", "..", ".DS_Store"]  # ignore these pointers/ files
    for file in os.listdir(path1):
        print('Checking duplicates for %s' % file)
        if file in os.listdir(path2):
            print('ok')
            if file not in ignore:
                print('Duplicate found: %s <---------' % file)
                delete_larger_file(path1 + "/" + file, path2 + "/" + file)


def delete_larger_file(path1, path2):
    if os.path.getsize(path1) >= os.path.getsize(path2):
        print('Duplicates: %s - %s - deleting the first one' % (path1, path2))
        os.remove(path1)
    else:
        print('Duplicates: %s - %s - deleting the second one' % (path1, path2))
        os.remove(path2)


def merge_folders(path1, path2):
    for file in os.listdir(path1):
        if file not in os.listdir(path2):
            os.rename(path1 + "/" + file, path2 + "/" + file)


compare_folders(path1, path2)
merge_folders(path1, path2)