你好,我正在清理我的电脑,所以我发现自己向Handbrake提供了一个巨大的文件列表来压缩它们。压缩后,一些文件的大小比原始文件大。我想清理一下,所以我试着做了一个小的python脚本。
基本上,我有两个文件夹,其中的文件名称相同,但大小不同,我想比较文件以删除较大的文件,所以如果我合并文件夹,我只保存大小较小的文件。
我举了一个我有的文件夹的例子
- 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])
根据大小删除文件
这是一个简单的过程,可以在一个函数中实现。
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
我发布了完整的代码,以防有人需要,感谢@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)