【Python高阶技巧】递归
一、递归
二、递归找文件
三、os模块
四、os模块的3个基础方法
五、代码实现
六、总结
一、递归
递归是一种编程技术,其中一个函数在执行过程中调用自身。递归通常用于解决可以被拆分为更小且相似问题的问题。它是一种强大的工具,特别适用于问题的分治解决方案。
递归的基本思想包括两个关键部分:
-
基本情况(Base Case): 递归函数中的一个条件,当满足这个条件时,函数不再调用自身,而是返回一个确定的值。这是避免无限循环的关键。
-
递归步骤: 在函数内部调用自身,但问题规模更小。通过不断地调用自身来解决较小规模的问题,最终达到基本情况。
下面是一个简单的例子,计算阶乘的递归实现:
def factorial(n):
# 基本情况:当n为0或1时,阶乘为1
if n == 0 or n == 1:
return 1
# 递归步骤:n的阶乘等于n乘以(n-1)的阶乘
else:
return n * factorial(n - 1)
# 示例调用
result = factorial(5)
print("5的阶乘是:", result)
在这个例子中,当 n
不为0或1时,函数调用自身,并将问题规模减小为 (n-1)
。递归的终止条件是 n
为0或1,此时直接返回1,不再继续递归。
递归是一种强大的编程技术,但在使用时需要小心处理基本情况,以防止无限递归。
二、递归找文件
递归查找文件是指通过一个函数调用自身的方式,在文件系统中逐层查找目标文件或目录。这通常用于深度优先搜索文件系统中的目录结构。下面是一个简单的 Python 脚本示例,演示了如何使用递归查找文件:
import os
def find_files(start_path, target_file):
# 获取指定路径下的所有文件和目录
items = os.listdir(start_path)
for item in items:
# 拼接完整路径
item_path = os.path.join(start_path, item)
# 判断是否为目标文件
if os.path.isfile(item_path) and item == target_file:
print("找到目标文件:", item_path)
# 判断是否为目录,如果是则递归调用
elif os.path.isdir(item_path):
find_files(item_path, target_file)
# 示例调用
start_directory = "/path/to/search" # 替换为实际的起始目录
target_filename = "example.txt" # 替换为实际的目标文件名
find_files(start_directory, target_filename)
在这个示例中,find_files
函数接受起始路径和目标文件名作为参数。它首先获取指定路径下的所有文件和目录,然后遍历每个项目。如果项目是一个文件且文件名与目标文件名匹配,则输出找到的文件路径。如果项目是一个目录,则递归调用 find_files
函数,进一步查找该目录中的文件。
请替换示例中的 /path/to/search
和 example.txt
为实际的起始目录和目标文件名。这是一个简单的演示,实际应用中可能需要考虑文件名匹配的规则、权限等因素。
三、os模块
os
模块是 Python 标准库中的一个模块,提供了与操作系统相关的功能。以下是 os
模块中一些常用的函数和属性:
-
文件和目录操作:
os.getcwd()
: 获取当前工作目录。os.chdir(path)
: 修改当前工作目录。os.listdir(path='.')
: 返回指定目录下的所有文件和目录的列表。os.mkdir(path)
: 创建目录。os.makedirs(path)
: 递归创建多层目录。
-
路径操作:
os.path.join(path1, path2, ...)
: 将多个路径组合成一个。os.path.abspath(path)
: 返回规范化的绝对路径。os.path.exists(path)
: 判断路径是否存在。os.path.isdir(path)
: 判断是否为目录。os.path.isfile(path)
: 判断是否为文件。
-
环境变量:
os.environ
: 包含当前环境变量的字典。os.getenv(name, default=None)
: 获取环境变量的值。
-
系统命令:
os.system(command)
: 在子shell中执行系统命令。os.popen(command)
: 打开一个管道用于读取或写入。os.spawnl(mode, path, ...)
和os.spawnv(mode, path, args)
: 在新进程中执行程序。
-
删除文件和目录:
os.remove(path)
: 删除文件。os.rmdir(path)
: 删除目录。os.removedirs(path)
: 递归删除目录。
这只是 os
模块的一小部分功能,还有其他一些方法和属性可供使用。这个模块对于处理文件、目录和系统级操作非常有用。
四、os模块的3个基础方法
os.listdir方法 返回指定目录下所有文件和目录的函数
os.listdir(path='.')
是 os
模块中用于返回指定目录下所有文件和目录的函数。具体来说:
path
: 可选参数,表示要列出内容的目录路径,默认为当前工作目录('.'
)。
该函数返回一个包含目录中所有文件和目录名称的列表。下面是一个简单的示例:
import os
# 获取当前工作目录下的所有文件和目录
files_and_dirs = os.listdir()
# 打印列表中的每个项
for item in files_and_dirs:
print(item)
上述示例中,os.listdir()
返回当前工作目录下的所有文件和目录的列表,并通过 for
循环逐个打印出来。
你还可以指定一个特定的目录路径作为参数,例如:
import os
# 获取指定目录下的所有文件和目录
path = '/path/to/directory'
files_and_dirs = os.listdir(path)
# 打印列表中的每个项
for item in files_and_dirs:
print(item)
请将 /path/to/directory
替换为实际的目录路径。这样,os.listdir()
将返回指定目录下的所有文件和目录。
os.path.isdir方法 判断指定路径是否为目录
os.path.isdir(path)
是 os.path
模块中的一个函数,用于判断指定路径是否为目录。具体来说:
path
: 要检查的路径。
该函数返回一个布尔值,如果指定的路径为目录,则返回 True
;否则返回 False
。
下面是一个简单的示例:
import os
# 指定一个路径
path = '/path/to/directory'
# 检查路径是否为目录
if os.path.isdir(path):
print(f"{path} 是一个目录。")
else:
print(f"{path} 不是一个目录。")
在上述示例中,如果 /path/to/directory
是一个目录,则打印相应的信息。你可以根据实际情况替换路径。
这个函数在编写程序时非常有用,因为它允许你在操作文件系统时检查给定路径是文件还是目录。
os.path.exists方法 检查指定路径是否存在
os.path.exists(path)
是 os.path
模块中的函数,用于检查指定路径是否存在。具体来说:
path
: 要检查的路径。
该函数返回一个布尔值,如果指定的路径存在,则返回 True
;否则返回 False
。
以下是一个简单的示例:
import os
# 指定一个路径
path = '/path/to/some/file.txt'
# 检查路径是否存在
if os.path.exists(path):
print(f"{path} 存在。")
else:
print(f"{path} 不存在。")
在这个示例中,如果 /path/to/some/file.txt
存在,则打印相应的信息。你可以根据实际情况替换路径。
这个函数常用于在进行文件或目录操作之前,先检查路径是否存在,以避免在不存在的路径上进行操作引发错误。
五、代码实现
"""
演示Python递归操作
需求:通过递归,找出一个指定文件夹内的全部文件
思路:写一个函数,列出文件夹内的全部内容,如果是文件就收集到list
如果是文件夹,就递归调用自己,再次判断。
"""
import os
def test_os():
"""演示os模块的3个基础方法"""
print(os.listdir("D:/test")) # 列出路径下的内容
# print(os.path.isdir("D:/test/a")) # 判断指定路径是不是文件夹
# print(os.path.exists("D:/test")) # 判断指定路径是否存在
def get_files_recursion_from_dir(path):
"""
从指定的文件夹中使用递归的方式,获取全部的文件列表
:param path: 被判断的文件夹
:return: list,包含全部的文件,如果目录不存在或者无文件就返回一个空list
"""
print(f"当前判断的文件夹是:{path}")
file_list = []
if os.path.exists(path):
for f in os.listdir(path):
new_path = path + "/" + f
if os.path.isdir(new_path):
# 进入到这里,表明这个目录是文件夹不是文件
file_list += get_files_recursion_from_dir(new_path)
else:
file_list.append(new_path)
else:
print(f"指定的目录{path},不存在")
return []
return file_list
if __name__ == '__main__':
print(get_files_recursion_from_dir("D:/test"))
def a():
a()
六、总结
- 什么是递归
在满足条件的情况下,函数自己调用自己的一种特殊编程技巧 - 递归需要注意什么?
- 注意退出的条件,否则容易变成无限递归
- 注意返回值的传递,确保从最内层,层层传递到最外层
- os模块的3个方法
- os.listdir,列出指定目录下的内容
- os.path.isdir,判断给定路径是否是文件夹,是返回True,否返回False
- os.path.exists,判断给定路径是否存在,存在返回True,否则返回False
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!