python中,遍历目录及子目录,并抓取特定文件

一、使用listdir(dir)
  • 思路:os模块的listdir(dir)方法可以获取当前目录下所有的目录及文件。由此可以进行目录遍历,并用递归的方法进行深度遍历。(代码只做了最简单的完成,如果需要保持程序的健壮性,请自行添加…)
  • SA:
def get_files(dir, suffix):
    """
    :param dir: 进行深度遍历的目录
    :param suffix: 抓取文件的类型(后缀),比如 test.txt 后缀即是 .txt
    :return: None
    """
    files_list = os.listdir(dir)
    for file in files_list:
        if os.path.isfile(os.path.join(dir, file)):  # 目录和文件一定要使用绝对路径
            pre, suf = os.path.splitext(file)
            if suf == suffix:
                print(os.path.join(dir, file))  # 打印抓取到的文件的绝对路径(从根目录开始,windows从盘符开始,类unix从'/'开始)
        else:
            get_files(os.path.join(dir, file), suffix)  # 递归调用 路径必须是绝对路径
get_files(os.getcwd(), '.py')  # 获取当前工作环境下的.py文件
  • 所存在问题:这样的话只能打印文件,如何将抓取到的文件存储到容器中进行返回?这个容器在此函数的上下文中是唯一的。
二、listdir(dir)进阶
  • 思路:上个问题主要的是,要解决如何在递归中传值的问题。而递归之间的联系在于参数,所以这个容器可以当做参数在函数之间调用。
  • SA:
def get_files(dir, suffix, py_fs=list()):
    """
    :param py_fs: 用于存放文件路径的容器
    :return: 抓取到的指定文件列表
    """
    files_list = os.listdir(dir)
    for file in files_list:
        if os.path.isfile(os.path.join(dir, file)):
            pre, suf = os.path.splitext(file)
            if suf == suffix:
                py_fs.append(os.path.join(dir, file))  # 存储抓取到的文件
        else:
            get_files(os.path.join(dir, file), suffix, py_fs)  # 传递到下一层, py_fs可能会出现警告“不期望出现的参数, 这是编辑器的语法检测,不影响程序运行”

    return py_fs
    
py_files = get_files(os.getcwd(), '.py')
for file in py_files:
    print(file)
  • PS:这个容器在函数定义时被初始化,传递的时候怎么还是同一个容器呢? python中,分为可变对象和不可变对象。不可变对象传值,可变对象传引用。在该程序中,列表输出可变对象,传递到下一层的时候就是引用,列表只在函数调用时初始化一次。可变对象与不可变对象在改文章开头有做简单介绍:深拷贝与浅拷贝之间的区别
  • 问题:是否有感觉递归的繁琐,并且递归所占资源消耗很大,有没有更简单更实用的方法?
三、walk(dir)
  • 该函数同样属于os模块,参数是目录,返回的是一个生成器。该生成器每次返回一个目录下的三个信息:
    root:根目录
    dirs : 目录下的所有目录
    files:目录下的所有文件
    直到将所有的目录遍历完为止
  • SA:
def get_files(dir, suffix):
    py_files = []
    for root, dirs, files in os.walk(dir):  # 遍历所有目录,包括自身
        for file in files:  # 遍历文件,抓取指定文件
            pre, suf = os.path.splitext(file)
            if suf == suffix:
                py_files.append(os.path.join(root, file))
    return py_files
  • PS:是不是很简单?并且更好理解,只用了for循环,即使递归不好理解也可以记住这一个。
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值