这个专栏记录我学习/科研过程中遇到的一些小问题以及解决方案,一些问题可能比较蠢请见谅。自用,仅供参考。
------------------------------------------------------------------------------------
Python中的os.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(‘/’):以"/"分割路径
import os
path = "/data1/abc/123/assets/"
parts = path.strip('/').split('/')
print(parts) # 输出['data1', 'abc', '123', 'assets']
注意,,因为 split() 方法按每个 / 进行分割,而如果路径以 / 开头,分割出来的第一个元素会是空字符串。所以通过 strip(‘/’) 去除前后的 / 以避免这种情况。另外,。
2. 路径信息获取
☆2.1 os.path.exists(path):检查路径是否存在
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):检查是否为文件
import os
if os.path.isfile('file.txt'):
print("这是一个文件")
2.4 os.path.isdir(path):检查是否为目录
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):提取公共前缀
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):解析符号链接,返回真实路径
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)
,其中:
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):递归创建目录
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:以树状图的方式列出目录结构
tree /path/to/your/folder
如果希望导出为.txt文件:
tree /path/to/your/folder > directory_tree.txt
结果如下: