你好,我正在清理我的電腦,所以我發現自己向 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])
uj5u.com熱心網友回復:
根據大小洗掉檔案
這是一個簡單的程序,可以在一個功能中實作。
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
uj5u.com熱心網友回復:
我發布了完整的代碼,以防有人需要它,感謝@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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/440049.html
標籤:Python python-3.x 文件 重复 文件比较
上一篇:如何在子目錄中編輯.py組態檔?
下一篇:在本地同步兩個檔案夾中的操作c#
