Python笔试题(在当前目录以及当前目录的所有子目录下查找文件名包含指定字符串的文件,并打印出路径)详解

    前言:

这道题想必大家在面试或者练习时都遇到过,是一道经典的Python笔试题,主要考察的是对python标准库的基本使用。

过程用到的os的基本模块

os.listdir(path): 列举目录下的所有文件(包含目录),返回一个列表
os.path.join(path1,path2): 将路径进行组合
os.path.isfile(path): 判断是否为文件 

解题思路

这道题的解题思路同样十分的简单,无非就是经典的三步走。
数据输入: 这里面则是获取当前目录以及子目录下的所有文件或目录的名字
数据处理:判断名字是否为文件,再判断名称是否包含指定的字符串
数据输出:确定了包含指定字符串的文件,然后输出其相对/绝对路径

具体实现

先实现第一步,获取当前目录以及子目录下的所有文件或目录的名字。
这一步很简单,通过简单的递归就能实现。具体代码如下:

import os
path = r"C:\Users\use\Desktop\2019-12-31"
Aggregate_list = []
def search_file(path):
    for file in os.listdir(path):
        this_path = os.path.join(path, file)
        if os.path.isfile(this_path):
            Aggregate_list.append(this_path)
        else:
            Aggregate_list.append(this_path)
            search_file(this_path) 
    return Aggregate_list
    
print(search_file(path))

接着其实我们就是实现第二步,判断名字是否为文件(其实已经实现过了),判断名称是否包含指定的字符串,这一步同样很简单。只需要简单的加个判断,再返回包含的字符串,所以我们的参数又多了一个。具体代码如下:

find_str = "screen_str"
Aggregate_list = []
def search_file(path, find_str):
    for file in os.listdir(path):
        this_path = os.path.join(path, file)
        if os.path.isfile(this_path):
            if find_str in this_path:
                Aggregate_list.append(this_path)
        else:
            search_file(this_path, find_str)
    return Aggregate_list

print(search_file(path, find_str))

只是这样实现,我们觉得还差点什么。我们期望有一个函数,我们传进去一个参数,返回一个路径集合。我们简单优化一下:

def get_file_path_list(path, find_str):
    def search_file(path, find_str):
        for file in os.listdir(path):
            this_path = os.path.join(path, file)
            if os.path.isfile(this_path):
                if find_str in this_path:
                    Aggregate_list.append(this_path)
            else:
                search_file(this_path, find_str)
    Aggregate_list = []
    assert os.path.isdir(path), f"{path} is not a dir"
    search_file(path, find_str)
    return Aggregate_list
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值