这个专栏记录我学习/科研过程中遇到的一些小问题以及解决方案,一些问题可能比较蠢请见谅。自用,仅供参考。


------------------------------------------------------------------------------------

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)

15. Python中的os.path模块/路径操作相关-LMLPHP


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. 路径操作


我们以下面这样一个目录为例进行展示:

15. Python中的os.path模块/路径操作相关-LMLPHP

☆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("-------------------------------------------")

结果如下:

15. Python中的os.path模块/路径操作相关-LMLPHP


☆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

结果如下:

15. Python中的os.path模块/路径操作相关-LMLPHP

11-20 17:02