这个专栏记录我学习/科研过程中遇到的一些小问题以及解决方案,一些问题可能比较蠢请见谅。自用,仅供参考。
------------------------------------------------------------------------------------
Python中的os.path模块详解(包括一些常用的路径操作相关操作)
文章目录
- Python中的os.path模块详解(包括一些常用的路径操作相关操作)
- 1. 路径拼接与分割
- ☆1.1 os.path.join(*paths):路径拼接
- ☆1.2 os.path.split(path):路径分割
- ☆1.3 os.path.splitext(path):路径与扩展名分割
- ☆1.4 path.strip('/').split('/'):以"/"分割路径
- 2. 路径信息获取
- ☆2.1 os.path.exists(path):检查路径是否存在
- 2.2 os.path.getsize(path):获取文件/目录大小
- 2.3 os.path.isfile(path):检查是否为文件
- 2.4 os.path.isdir(path):检查是否为目录
- ☆2.5 os.getcwd():获取当前工作目录
- ☆2.6 str.endswith(A) / str.startswith(B):字符串是否以A结尾 / B开头
- 3. 路径信息提取
- 3.1 os.path.abspath(path):提取路径的绝对路径
- 3.2 os.path.basename(path):提取路径中最后一个部分
- 3.3 os.path.dirname(path):提取文件所在的目录
- 3.4 os.path.commonprefix(paths):提取公共前缀
- 4. 路径规范化
- 4.1 os.path.realpath(sympath):解析符号链接,返回真实路径
- 4.2 os.path.normpath(path):消除路径冗余
- 5. 路径操作
- ☆5.1 os.walk(path):遍历某个路径下的所有子目录和文件(遍历所有)
- ☆5.2 os.listdir(path):列出当前目录下的所有文件和子目录名称(仅当前路径下)
- ☆5.3 os.makedirs(path):递归创建目录
- 5.4 os.rename(path):重命名
- 5.5 shutil.rmtree(path):删除目录树(包括path本身)
- 5.6 os.remove(path):删除文件
- 6. 获取目录结构
- ☆6.1 【bash】tree path:以树状图的方式列出目录结构
os.path
是Python标准库中用于处理和操作文件路径的模块。它提供了一个平台无关的接口,用于常见的文件和目录路径操作,如路径拼接、查询文件类型、获取文件信息等。os.path模块可以在不同操作系统(如 Windows、Linux、macOS)上兼容与文件路径操作相关的代码,各个操作系统上的差异非常小(例如路径分隔符的不同等)。
以下是os.path
一些常用函数的总结,包括使用场景与案例(注意,所有的案例均在Linux操作系统上)。除此之外,一些与路径操作相关的函数(例如os.walk等)也同样纳入总结:
1. 路径拼接与分割
☆1.1 os.path.join(*paths):路径拼接
功能:将多个路径组件合成一个路径。
import os
path = os.path.join('folder', 'subfolder', 'file.txt')
print(path) # 输出 'folder/subfolder/file.txt'
☆1.2 os.path.split(path):路径分割
功能:将路径分割成目录部分和文件名部分(注意,并不是将路径按“/”进行分割!)。
head, tail = os.path.split('/folder/subfolder/file.txt')
print("目录:", head) # 输出 '/folder/subfolder'
print("文件名:", tail) # 输出 'file.txt'
☆1.3 os.path.splitext(path):路径与扩展名分割
功能:分割文件路径为根路径和扩展名。
root, ext = os.path.splitext('file.txt')
print("文件名:", root) # 输出 'file'
print("扩展名:", ext) # 输出 '.txt'
☆1.4 path.strip(‘/’).split(‘/’):以"/"分割路径
功能:以“/”来分割路径,比如将’/folder/subfolder/file.txt’分割为[‘folder’、‘subfolder’、‘file.txt’]。
import os
path = "/data1/abc/123/assets/"
parts = path.strip('/').split('/')
print(parts) # 输出['data1', 'abc', '123', 'assets']
注意,strip(‘/’)用于去除路径首尾的 /,因为 split() 方法按每个 / 进行分割,而如果路径以 / 开头,分割出来的第一个元素会是空字符串。所以通过 strip(‘/’) 去除前后的 / 以避免这种情况。另外,split() 方法的输出为列表。
2. 路径信息获取
☆2.1 os.path.exists(path):检查路径是否存在
功能:检查路径是否存在,返回 True 或 False。
import os
if os.path.exists('file.txt'):print("文件存在")
else:print("文件不存在")
2.2 os.path.getsize(path):获取文件/目录大小
功能:返回文件或目录的大小(以字节为单位)。
import os
size = os.path.getsize('/data1/dyz/ffmpeg/')
print(f"文件大小: {size} 字节") # 输出:文件大小: 4096 字节
2.3 os.path.isfile(path):检查是否为文件
功能:检查给定路径是否是文件(而不是一个目录),返回 True 或 False。
import os
if os.path.isfile('file.txt'):print("这是一个文件")
2.4 os.path.isdir(path):检查是否为目录
功能:检查给定路径是否是目录(而不是一个文件),返回 True 或 False。
import os
if os.path.isdir('folder'):print("这是一个目录")
☆2.5 os.getcwd():获取当前工作目录
功能:获取当前工作目录(即正在执行脚本的目录)。
import os
current_directory = os.getcwd()
print("当前工作目录:", current_directory)
☆2.6 str.endswith(A) / str.startswith(B):字符串是否以A结尾 / B开头
功能:检查字符串是否以某个字符串结尾或开头,在筛选文件时尤其有用。 例如下面给出了一个案例,统计某一路径下的所有文件,找出以 “.pt” 结尾的文件和以 “test” 开头的文件。
import os
current_directory = os.getcwd()
print("当前工作目录:", current_directory)
3. 路径信息提取
3.1 os.path.abspath(path):提取路径的绝对路径
功能:提取某一路径的绝对路径,或将相对路径转换为绝对路径。
import os
abs_path = os.path.abspath('file.txt')
print(abs_path) # 输出文件的绝对路径
3.2 os.path.basename(path):提取路径中最后一个部分
功能:提取路径的最后一个部分(文件名或目录名)。
import os
basename = os.path.basename('/folder/subfolder/file.txt')
print(basename) # 输出 'file.txt'
3.3 os.path.dirname(path):提取文件所在的目录
功能:提取路径中的目录部分(最后一个部分之前的内容)。
import os
dirname = os.path.dirname('/folder/subfolder/file.txt')
print(dirname) # 输出 '/folder/subfolder'
3.4 os.path.commonprefix(paths):提取公共前缀
功能:提取路径列表中所有路径的公共前缀部分(注意,paths是路径列表)。
import os
common = os.path.commonprefix(['/folder/subfolder/file1.txt', '/folder/subfolder/file2.txt'])
print(common) # 输出 '/folder/subfolder/'
4. 路径规范化
4.1 os.path.realpath(sympath):解析符号链接,返回真实路径
功能:解析符号链接,获取实际的文件路径(注意,sympath为符号链接)。
import os
real_path = os.path.realpath('symlink_to_file.txt')
print(real_path) # 输出真实文件路径
4.2 os.path.normpath(path):消除路径冗余
功能:规范化路径,消除多余的分隔符或上级目录。
import os
path = os.path.normpath('/folder//subfolder/../file.txt')
print(path) # 输出 '/folder/file.txt',消除了多余的分隔符和上级目录
5. 路径操作
我们以下面这样一个目录为例进行展示:
☆5.1 os.walk(path):遍历某个路径下的所有子目录和文件(遍历所有)
功能:递归遍历指定目录下的所有目录和文件,并返回每个目录中的文件名。
os.walk()
是一个生成器,它会递归遍历指定目录下的所有目录和文件,并返回每个目录中的文件名。它会生成一个三元组(dirpath, dirnames, filenames)
,其中:
dirpath:当前目录的路径。
dirnames:当前目录下的子目录列表。
filenames:当前目录下的文件列表。
import os
directory = '/data1/dyz/Gaitcode/'
# 使用 os.walk() 遍历目录及其子目录
for dirpath, dirnames, filenames in os.walk(directory):print("以下为目录{}的所有子目录和文件。".format(dirpath))for dirname in dirnames:subdir_path = os.path.join(dirpath, dirname) # 找到每个子目录的名称print("子目录名称:", subdir_path)for filename in filenames:file_path = os.path.join(dirpath, filename) # 找到每个文件的名称print("文件名称:", file_path)print("-------------------------------------------")
结果如下:
☆5.2 os.listdir(path):列出当前目录下的所有文件和子目录名称(仅当前路径下)
功能:返回指定路径下的文件和目录的名称列表(注意,返回的是一个按字母顺序排列名称的列表,不包含路径)。但不会在更下一级目录中查找,即不会遍历查找。
import os
directory = '/data1/dyz/Gaitcode/'
contents = os.listdir(directory)
print(contents)
# 这段代码将返回:['cal_acc.py', 'test_2024-09-11-02-53-18.log', 'model', 'test.sh', 'answer_list.csv',
# 'common.py', 'main.py', 'config.py', 'train.sh', 'work']
☆5.3 os.makedirs(path):递归创建目录
功能:递归创建目录。如果父目录不存在,则会创建它们。虽然 os.mkdir(path)
也可以创建目录,但当目录层级较多且可能父目录不存在时,更推荐使用 os.makedirs(path)
来创建目录。
import os
os.makedirs('/data1/dyz/Gaitcode/child', exist_ok=True)
5.4 os.rename(path):重命名
功能:重命名文件或目录。
import os
os.rename('/data1/dyz/Gaitcode/child', '/data1/dyz/Gaitcode/newchild')
5.5 shutil.rmtree(path):删除目录树(包括path本身)
功能:直接删除整个目录树(包括所有文件和子目录),不需要自己手动递归删除,适合用于清空整个目录。
import shutil
dir = '/data1/dyz/Gaitcode/newchild/'
shutil.rmtree(dir) # 谨慎操作!
5.6 os.remove(path):删除文件
功能:删除某一文件。
import os
os.remove('/path/to/file')
6. 获取目录结构
☆6.1 【bash】tree path:以树状图的方式列出目录结构
功能:Linux 系统自带 tree
命令,可以非常方便地生成目录结构的树状图。
tree /path/to/your/folder
如果希望导出为.txt文件:
tree /path/to/your/folder > directory_tree.txt
结果如下: