Python查找大文件的实用脚本分享

 更新时间:2024年11月04日 11:09:10   作者:zhongcx01  
这篇文章主要为大家分享一个利用Python查找大文件的实用脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

C盘满了,写了一个python脚本,2分多钟能找到比较大的文件,然后手动删除或者迁移D盘,最后发现是微信小程序开发工具缓存文件太多了,腾出来10个G念头通达了,这里备份一下脚本。

运行工具:PyCharm 2024.1.3 (Community Edition)

完整代码

import os
import threading
import time
import sys
from threading import Event
 
def is_large(file_path, threshold_mb):
    """判断文件大小是否超过指定MB阈值"""
    return os.path.getsize(file_path) / (1024 * 1024) > threshold_mb
 
def show_loading_animation(stop_event, interval=0.5):
    """显示简易的文本加载动画,直到接收到停止信号"""
    loading_chars = ['.', '..', '...', '....']
    total_cycles = int(interval * 10)
    cycle_length = 10
 
    for _ in range(total_cycles):
        for char in loading_chars:
            for _ in range(cycle_length):
                sys.stdout.write('\r正在查找大文件... ' + char)
                sys.stdout.flush()
                time.sleep(interval / cycle_length)
            sys.stdout.write('\r正在查找大文件... ' + loading_chars[0])
            sys.stdout.flush()
 
def filter_files(files, skip_file_keywords, include_file_keywords, extension=None):
    """根据文件名关键词和扩展名过滤文件列表"""
    filtered_files = [file for file in files if (not skip_file_keywords or all(keyword not in file for keyword in skip_file_keywords)) and
                      (not include_file_keywords or any(keyword in file for keyword in include_file_keywords))]
    if extension is not None:
        filtered_files = [file for file in filtered_files if file.endswith('.' + extension)]
    return filtered_files
 
def filter_dirs(dirs, skip_dir_keywords, include_dir_keywords):
    """根据目录名关键词过滤目录列表"""
    return [dir for dir in dirs if (not skip_dir_keywords or all(keyword not in dir for keyword in skip_dir_keywords)) and
             (not include_dir_keywords or any(keyword in dir for keyword in include_dir_keywords))]
 
def get_all_large_files_with_loading(dir_path, threshold_mb, skip_dir_keywords, skip_file_keywords, include_dir_keywords, include_file_keywords, extension=None, interval=0.5):
    """查找目录下所有大于指定大小的文件,同时跳过或仅包括特定关键词的文件夹及文件名称,并显示加载动画直到完成"""
    start_time = time.time()
    stop_event = Event()
    large_files = []
    loading_thread = threading.Thread(target=show_loading_animation, args=(stop_event, interval))
    loading_thread.daemon = True
    loading_thread.start()
 
    try:
        for root, dirs, files in os.walk(dir_path):
            dirs[:] = filter_dirs(dirs, skip_dir_keywords, include_dir_keywords)
            filtered_files = filter_files(files, skip_file_keywords, include_file_keywords, extension)
            for file in filtered_files:
                full_path = os.path.join(root, file)
                try:
                    if is_large(full_path, threshold_mb):
                        file_info = {'path': full_path, 'size': os.path.getsize(full_path) / 1024 / 1024}
                        large_files.append(file_info)
                except Exception as e:
                    print(f"警告访问文件出错 {full_path} 出错信息: {e}")
 
    finally:
        stop_event.set()
        loading_thread.join()
    large_files.sort(key=lambda x: x['size'], reverse=True)
    for file_info in large_files:
        print(f"文件路径: {file_info['path']} | 文件大小: {file_info['size']:.2f} MB")
 
    end_time = time.time()
    print(f"\n查找共耗时: {end_time - start_time:.2f} 秒")
 
def main():
    dir_path = input("请输入要检查的目录路径: ")
    try:
        threshold_mb = float(input("请输入文件大小阈值(单位: MB): "))
        skip_dir_keywords = input("请输入要跳过的文件夹名关键词,用逗号分隔(直接回车跳过,推荐modules,~~,.gradle): ").split(',')
        skip_file_keywords = input("请输入要跳过的文件名关键词,用逗号分隔(直接回车跳过,推荐$): ").split(',')
        include_dir_keywords = input("请输入要包含的文件夹名关键词,用逗号分隔(直接回车跳过): ").split(',')
        include_file_keywords = input("请输入要包含的文件名关键词,用逗号分隔(直接回车跳过): ").split(',')
        extension = input("请输入要筛选的文件扩展名(例如:txt,可选,直接回车跳过): ").strip('.') or None
        get_all_large_files_with_loading(dir_path, threshold_mb, skip_dir_keywords, skip_file_keywords, include_dir_keywords, include_file_keywords, extension)
        print("搜索结束.")
    except ValueError:
        print("错误:请输入有效的数字作为文件大小阈值.")
    except OSError as e:
        print(e)
 
if __name__ == '__main__':
    main()

方法补充

除了上文的方法,小编还为大家整理了其他Python查找大文件的方法,希望对大家有所帮助

完整代码如下

#! python3
#chapter09-test02.py - 找出一个文件夹内的大文件,并打印出大文件的绝对路径<br>#-----为了防止运行时间过长,我把程序设置为了只检查前1000个超过size的文件,他们并不是最大的1000个
 
import os,pprint,sys
import timeit,time
 
 
#装饰器--计算程序运行时间
def colocked_decorator(func):
    def colock(*args):
        startTime=timeit.default_timer()
        result=func(*args)  #运行程序
        spendTime=timeit.default_timer()-startTime
        name=func.__name__  #获取程序名字
        arg_str=','.join(repr(arg) for arg in args) #注意不是*args  组成程序参数的字符串
        print('[0.7fs] %s(%s) '%(spendTime,name,arg_str),end='')
        print('%r',result)
        return result
    return colock
 
#寻找指定文件夹内的的大文件
#返回包含所有大文件的绝对地址的一个列表
#folder-指定的文件夹地址
#size-阈值,超过这个为大文件
@colocked_decorator
def findBigFile(folder,size):
    bigFileAbs=[]
    for foldername,subfolders,filenames in os.walk(folder):
        #对文件进行遍历
        for filename in filenames:
            #.getsize(path)必须是完整路径
            fileAbs=os.path.join(foldername,filename)
            if os.path.getsize(fileAbs)>size and len(bigFileAbs)<100:   
                #fileAbs=os.path.join(foldername,filename)
                fileAbs=os.path.abspath(fileAbs)
                bigFileAbs.append(fileAbs)
    return bigFileAbs
 
#定义一个函数用来将尺寸变为KB、MB这样的单位,但是没有在这个程序中使用
#size-是os.getsize()返回的文件尺寸数值
#is_1024_byte 代表以1024去转化还是1000去转化,默认是1024
#先定义的后缀
SUFFIXES = {1000:['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
            1024:['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']}
def humanReadable_size(size,is_1024_byte=True):
    #mutiple默认是1000
    mutiple=1000 if is_1024_byte else 1024
    #与for遍历结合起来,这样来进行递级的转换
    for suffix in SUFFIXES[mutiple]:
        size/=mutiple
        #直到Size小于能往下一个单位变的数值
        if size<mutiple:
            return '{0:.1f}{1}'.format(size,suffix)
    raise ValueError('number too large')
 
         
 
path='F:\DCIM'
size=1000000    #设定的阈值
#先判断路径是否存在
if os.path.exists(path):   
    resultList=findBigFile(path,size)
    pprint.pprint(resultList)
     
else:
    print('You enter path does not exist')
    sys.exit()

到此这篇关于Python查找大文件的实用脚本分享的文章就介绍到这了,更多相关Python查找大文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python全景系列之模块与包全面解读

    Python全景系列之模块与包全面解读

    这篇文章将带大家深入探讨Python模块与包的基本概念,使用方法以及其在实际项目中的应用,同时也会揭示一些鲜为人知,却又实用的技术细节
    2023-05-05
  • 实例讲解python函数式编程

    实例讲解python函数式编程

    这篇文章主要介绍了python函数式编程实例,使用一个例子来阐述python函数式编程,需要的朋友可以参考下
    2014-06-06
  • python实现学员管理系统

    python实现学员管理系统

    这篇文章主要为大家详细介绍了python实现学员管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • pytest通过assert进行断言的实现

    pytest通过assert进行断言的实现

    assert断言是一种用于检查代码是否按预期工作的方法,在pytest中,assert断言可以用于测试代码的正确性,以确保代码在运行时按照预期工作,本文就来介绍一下如何使用,感兴趣的可以了解下
    2023-12-12
  • Python3的高阶函数map,reduce,filter的示例详解

    Python3的高阶函数map,reduce,filter的示例详解

    这篇文章主要介绍了Python3的高阶函数map,reduce,filter的示例代码,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Python编译成.so文件进行加密后调用的实现

    Python编译成.so文件进行加密后调用的实现

    今天小编就为大家分享一篇Python编译成.so文件进行加密后调用的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python第三方库xlrd/xlwt的安装与读写Excel表格

    Python第三方库xlrd/xlwt的安装与读写Excel表格

    最近开始学习python,想做做简单的自动化测试,需要读写excel,于是就接触到了Python的第三方库xlrd和xlwt,下面这篇文章就给大家主要介绍了Python中第三方库xlrd/xlwt的安装与读写Excel表格的方法,需要的朋友可以参考借鉴。
    2017-01-01
  • 解决Jupyter Notebook “signal only works in main thread“问题

    解决Jupyter Notebook “signal only works&nb

    这篇文章主要介绍了解决Jupyter Notebook “signal only works in main thread“问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python实现的多线程同步与互斥锁功能示例

    Python实现的多线程同步与互斥锁功能示例

    这篇文章主要介绍了Python实现的多线程同步与互斥锁功能,涉及Python多线程及锁机制相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • python数据处理之Pandas类型转换的实现

    python数据处理之Pandas类型转换的实现

    本文主要介绍了python数据处理之Pandas类型转换的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论