一、使用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))
else:
get_files(os.path.join(dir, file), suffix)
get_files(os.getcwd(), '.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)
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循环,即使递归不好理解也可以记住这一个。