前言:
这道题想必大家在面试或者练习时都遇到过,是一道经典的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