0

你好,我正在清理我的电脑,所以我发现自己向 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

我写了这段代码,它似乎可以工作,但我想知道是否有更好的方法来做这件事,我听说过一个函数 filecompare 但我不明白我是否可以从中获取文件大小。

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

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])
4

1 回答 1

1

根据大小删除文件

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

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()比较两个文件的大小并删除较大的文件。
  • 后续调用对于merge_folders()合并文件夹是必要的。换句话说,它将比较两个文件夹的内容并将不在一个文件夹中的文件移动到另一个文件夹中。最后,一个文件夹应该是空的,另一个应该有所有最小的文件。
  • 请注意:这无法撤消,所以可以先测试一下吗?此外,如果有子文件夹,这将不起作用并且需要递归。

先打电话compare_folders()后打电话merge_folders

于 2022-03-02T22:01:58.577 回答