日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

詳解如何使用Python實現刪除重復文件_python

作者:冫馬讠成 ? 更新時間: 2022-11-21 編程語言

Python自動化辦公之刪除重復文件

思路介紹

兩層判斷:

1.先判斷文件大小是否為相同,大小不同則不是重復文件,予以保留;

2.文件大小相同再判斷文件md5,md5相同,則是重復文件,予以刪除。

源碼解說

from pathlib import Path
import hashlib


def getmd5(filename):
    # 接收文件路徑,返回文件md5值
    with open(filename, 'rb') as f:
        data = f.read()
    file_md5 = hashlib.new("md5", data).hexdigest()
    return file_md5


def main():
    path = r"F:\FileRecv\刪除文件測試"
    all_size = {}
    total_file = 0
    total_delete = 0

    # 獲取路徑內的所有文件名,默認是升序排列,相同文件將會保留日期時間最新的
    all_files = Path(path).glob('*.*')

    # 降序排列,相同文件將會保留文件名最短的(即日期時間最久的)
    all_files = sorted(all_files, reverse=True)

    # 遍歷文件路徑內的所有文件
    for file in all_files:
        # 獲取文件所占字節大小,作為數據字典的鍵
        size = file.stat().st_size
        # name_and_md5列表用于存儲文件絕對路徑和md5值,作為數據字典的值
        name_and_md5 = [file, '']

        # 針對重復文件進行處理,生成字典存儲相關信息
        # 字典all_size中key是size,value是name_and_md5列表
        # 針對相同size的文件,再調用getmd5函數,獲取文件的md5值
        # 文件size不同(不在all_size.keys()中),則自動判斷為不同的文件,予以保留
        if size in all_size.keys():
            # 調用getmd5函數,獲取文件的md5值
            new_md5 = getmd5(file)
            if all_size[size][1] == '':
                all_size[size][1] = getmd5(all_size[size][0])
            # 判斷md5值存在,即文件重復,則刪除文件。md5值不存在,則把md5值加入列表中
            if new_md5 in all_size[size]:
                file.unlink()
                total_delete += 1
            else:
                all_size[size].append(new_md5)
        else:
            all_size[size] = name_and_md5
        total_file += 1

    print(f'文件總數:{total_file}')
    print(f'刪除個數:{total_delete}')


if __name__ == '__main__':
    main()

效果圖:

代碼說明:特別感謝瑜亮老師提供的代碼!

知識拓展

pathlib和os,os.path常用的函數對應關系

pathlib常用方法介紹:

Path(path).name ?# 返回文件名+文件后綴

Path(path).stem ?# 返回文件名

Path(path).suffix ?# 返回文件后綴

Path(path).suffixes ?# 返回文件后綴列表

Path(path).root ?# 返回根目錄

Path(path).parts ?# 返回文件

Path(path).anchor ?# 返回根目錄

Path(path).parent ?# 返回父級目錄

Path(path).parents ?# 返回所有上級目錄的列表

Path.exists() ?# 判斷 Path 路徑是否是一個已存在的文件或文件夾

Path.is_dir() ?# 判斷 Path 是否是一個文件夾

Path.is_file() ?# 判斷 Path 是否是一個文件

Path.mkdir() ?# 創建文件夾

Path.rmdir() ?# 刪除文件夾,文件夾必須為空

Path.unlink() ?# 刪除文件

原文鏈接:https://mp.weixin.qq.com/s/7soU0wT3B4fufZ8s2Cyy5Q

欄目分類
最近更新