当前位置: 首页 > news >正文

os.path:平台独立的文件名管理

文章目录

  • 一、解析路径
    • 1、依赖变量:os.sep / os.extsep / os.pardir / os.curdir
    • 2、os.path.split():(路径其余部分, 路径最后一部分)
    • 3、os.path.basename():路径的最后一部分
    • 4、os.path.dirname():路径的其余部分(去除最后一部分)
    • 5、os.path.splitext():(路径其余部分, last扩展名分隔符+后面部分)
    • 6、os.path.commonprefix():不考虑路径分隔符的公共前缀
    • 7、os.path.commonpath():考虑路径分隔符的公共前缀
  • 二、建立路径
    • 1、os.path.join():合并多个路径组成部分
    • 2、os.path.expanduser():将波浪线~字符转换为用户主目录名
    • 3、os.path.expandvars():将 shell 环境变量替换为实际值
  • 三、规范化路径
    • 1、os.path.normpath():清除多余分隔符和 os.curdir,折叠 os.pardir + 上一级目录
    • 2、os.path.abspath():把相对路径名转换为绝对路径名
  • 四、获取文件属性
    • 1、os.stat():获取文件或目录的元数据信息
    • 2、os.path.getatime():获取文件的最后访问时间,Unix 时间戳
    • 3、os.path.getmtime():获取文件的最后修改时间,Unix 时间戳
    • 4、os.path.getctime():Linux > 最后元数据修改时间,Windows > 创建时间,Unix 时间戳
    • 5、os.path.getsize():以字节为单位表示的文件大小
  • 五、测试路径
    • 1、os.path.isabs():是否为绝对路径
    • 2、os.path.isfile():是否为一个普通文件(非目录、非符号链接等)
    • 3、os.path.isdir():是否为一个目录
    • 4、os.path.islink():是否为符号链接
    • 5、os.path.ismount():是否为挂载点
    • 6、os.path.exists():(文件 / 目录 / 有效符号链接)路径是否存在
    • 7、os.path.lexists():(文件 / 目录 / 符号链接)路径是否存在

os.path模块用于解析文件名,可以很方便地处理不同平台上的文件。

import os.path

一、解析路径

这部分介绍的函数用于将字符串解析成文件名的各个组成部分,不要求字符串所代表的路径真实存在

1、依赖变量:os.sep / os.extsep / os.pardir / os.curdir

路径解析依赖于os中定义的一些变量:

变量解释示例
os.sep路径各部分之间的分隔符/、\
os.extsep文件名称与类型之间的分隔符,即扩展名分隔符.
os.pardir路径中表示目录树上一级的部分. .
os.curdir路径中指示当前目录的部分.

2、os.path.split():(路径其余部分, 路径最后一部分)

os.path模块中的split()函数将字符串解析成「路径的其余部分」和「路径的最后一部分」,最后返回一个二元元组。

注意,字符串如果以「路径分隔符」结尾,元组的第二部分会是一个空字符串

PATHS = ['/one/two/three','/one/two/three/','/','.','',
]for path in PATHS:print(os.path.split(path))>>> 输出结果:
('/one/two', 'three')
('/one/two/three', '')
('/', '')
('', '.')
('', '')

3、os.path.basename():路径的最后一部分

os.path模块中的basename()函数返回路径的最后一部分,等价于split()返回值的第二部分。

同样,字符串如果以「路径分隔符」结尾,则会返回一个空字符串

PATHS = ['/one/two/three','/one/two/three/','/','.','',
]for path in PATHS:print(os.path.basename(path))>>> 输出结果:
'three'
''
''
'.'
''

4、os.path.dirname():路径的其余部分(去除最后一部分)

os.path模块中的dirname()函数返回路径的前面部分,等价于split()返回值的第一部分。

PATHS = ['/one/two/three','/one/two/three/','/','.','',
]for path in PATHS:print(os.path.dirname(path))>>> 输出结果:
'/one/two'
'/one/two/three'
'/'
''
''

5、os.path.splitext():(路径其余部分, last扩展名分隔符+后面部分)

os.path模块中的splitext()函数将字符串解析成「路径的其余部分」和「最后一个扩展名分隔符+后面部分」,最后返回一个二元元组。

注意:

  • 扩展名分隔符前面必须有内容,才算是真正的扩展名分隔符,否则解析后会把它放在第一部分中
  • 即使一个文件名包含多个扩展名,也只会解析最后一个扩展名分隔符
PATHS = ['filename.txt','filename','/path/to/filename.txt','/','','.','.test','my-archive.tar.gz','no-extension.',
]for path in PATHS:print(os.path.splitext(path))>>> 输出结果:
('filename', '.txt')
('filename', '')
('/path/to/filename', '.txt')
('/', '')
('', '')
('.', '')
('.test', '')
('my-archive.tar', '.gz')
('no-extension', '.')

6、os.path.commonprefix():不考虑路径分隔符的公共前缀

os.path模块中的commonprefix()函数接收一个路径列表作为参数。最后会返回一个字符串,表示所有路径中都出现的公共前缀。

注意,解析时不会考虑路径分隔符,所以解析得到的公共前缀不一定会落在分隔符边界上。

paths = ['/one/two/three/four','/one/two/threefold','/one/two/three/',]# /one/two/three
print(os.path.commonprefix(paths))

7、os.path.commonpath():考虑路径分隔符的公共前缀

os.path模块中的commonpath()函数则会考虑路径分隔符,该函数不会只返回路径值中的一部分

paths = ['/one/two/three/four','/one/two/threefold','/one/two/three/',]# /one/two
print(os.path.commonpath(paths))

二、建立路径

1、os.path.join():合并多个路径组成部分

os.path模块中的join()函数可以将「多个路径组成部分」结合为一个值。

注意:

  • 如果某个组成部分以路径分隔符开头,那么前面所有的组成部分都会被舍弃,该组成部分会成为新的开始部分。
  • 应该向join()函数传入多个路径组成部分,而非一个元组或者列表,注意下面代码中的*号
PATHS = [('one', 'two', 'three'),('/', 'one', 'two', 'three'),('/one', '/two', '/three'),
]for parts in PATHS:# 注意星号print(os.path.join(*parts))>>> 输出结果:
one/two/three
/one/two/three
/three

2、os.path.expanduser():将波浪线~字符转换为用户主目录名

os.path模块中的expanduser()函数可以将波浪线~字符转换为用户主目录名。

注意:

  • 如果用户的主目录无法找到,那么字符串将会直接原样返回,如下面的~nosuchuser
  • 在字符串前面添加路径分隔符,可以成功转换,但是不保证该路径真实存在,如下面的~/Documents
for user in ['', 'mycomputer', '/Documents', 'nosuchuser']:lookup = '~' + userprint(os.path.expanduser(lookup))# >>> 输出结果:
/Users/mycomputer
/Users/mycomputer
~nosuchuser
/Users/mycomputer/Documents

3、os.path.expandvars():将 shell 环境变量替换为实际值

os.path模块中的expandvars()函数会将路径中出现的「所有 shell 环境变量」替换为「变量对应的实际值」,但是不保证该路径真实存在

import osos.environ['MYVAR'] = 'VALUE'# /path/to/VALUE
print(os.path.expandvars('/path/to/$MYVAR'))

三、规范化路径

1、os.path.normpath():清除多余分隔符和 os.curdir,折叠 os.pardir + 上一级目录

os.path模块中的normpath()函数可以清除路径中「多余的路径分隔符」和「os.curdir」,也会折叠os.pardir及其上一级目录。

PATHS = ['one//two//three','one/./two/../three','zero/./one/../alt/two/three',
]for path in PATHS:print(os.path.normpath(path))>>> 输出结果:
one/two/three
one/three
zero/alt/two/three

2、os.path.abspath():把相对路径名转换为绝对路径名

os.path模块中的abspath()函数会把一个相对路径名转换为一个绝对路径名,返回一个从文件系统树最顶层开始的完整的路径。

import os# 用于改变当前 Python 程序的工作目录
os.chdir('/usr')PATHS = ['.','..','./one/two/three','../one/two/three',
]for path in PATHS:print(os.path.abspath(path))>>> 输出结果:
/usr
/
/usr/one/two/three
/one/two/three

四、获取文件属性

os.path模块中存在一些用于获取文件属性的函数,类似于os.stat()返回的结果。

1、os.stat():获取文件或目录的元数据信息

os模块中的stat()函数用于获取文件或目录的元数据信息。

import os
print(os.stat(__file__))>>> 输出结果:
os.stat_result(st_mode=33188, st_ino=36325802, st_dev=26777232, st_nlink=1, st_uid=501, st_gid=20, st_size=326, st_atime=1756800738, st_mtime=1756800738, st_ctime=1756800738)

返回的os.stat_result对象包含以下关键属性:

属性名含义示例值
st_mode文件类型和权限模式(整数)33188(普通文件,权限rw-r–r--)
st_ino文件的索引节点编号36325802
st_dev文件所在的设备标识符26777232
st_nlink硬链接数量1(默认)
st_uid所有者用户 ID(Unix 系统)1000
st_gid所有者组 ID(Unix 系统)1000
st_size文件大小(字节),目录通常返回 0 或固定值1024(1KB 文件)
st_atime最后访问时间(Unix 时间戳,秒)1690000000.123
st_mtime最后修改时间(Unix 时间戳,秒)1690000100.456
st_ctimeLinux:最后元数据修改时间;Windows:创建时间1690000200.789

对上表中的术语解释:

  • 文件的索引节点编号:通过这个编号可以在文件系统中唯一地定位到一个文件或目录。
  • 文件所在的设备标识符:设备标识符用于区分文件所在的物理或逻辑存储设备。
  • 硬链接:类 Unix 操作系统中一种特殊的文件关联机制,本质是同一个文件的多个 “别名”——多个文件名指向存储介质中相同的数据块和索引节点,实现对同一文件内容的共享访问。
  • Unix 时间戳:本质是一个整数(或浮点数),代表从 1970 年 1 月 1 日 00:00:00 UTC(世界协调时间) 开始,到目标时间点所经过的秒数。

2、os.path.getatime():获取文件的最后访问时间,Unix 时间戳

3、os.path.getmtime():获取文件的最后修改时间,Unix 时间戳

4、os.path.getctime():Linux > 最后元数据修改时间,Windows > 创建时间,Unix 时间戳

5、os.path.getsize():以字节为单位表示的文件大小

import time# time.ctime():将时间戳转换为可读的字符串格式
print('File         :', __file__)
print('Access time  :', time.ctime(os.path.getatime(__file__)))
print('Modified time:', time.ctime(os.path.getmtime(__file__)))
print('Change time  :', time.ctime(os.path.getctime(__file__)))
print('Size         :', os.path.getsize(__file__))>>> 输出结果:
File         : /Users/mycomputer/test.py
Access time  : Tue Sep  2 16:12:18 2025
Modified time: Tue Sep  2 16:12:18 2025
Change time  : Tue Sep  2 16:12:18 2025
Size         : 326

五、测试路径

os.path模块提供了一些函数用于测试一个路径名是文件、目录还是符号链接(symlink),还可以检验该路径名是否真实存在。这些测试函数均会返回布尔值。

符号链接(symlink,全称 symbolic link,也常称为 “软链接”)是操作系统中一种特殊的文件类型,本质是一个 “指向另一个文件或目录的引用”,类似于 Windows 系统中的 “快捷方式”,但功能更底层、适用范围更广(可跨文件系统,且在命令行操作中表现更接近原文件)。

1、os.path.isabs():是否为绝对路径

2、os.path.isfile():是否为一个普通文件(非目录、非符号链接等)

3、os.path.isdir():是否为一个目录

4、os.path.islink():是否为符号链接

5、os.path.ismount():是否为挂载点

“挂载点”(Mount Point)是操作系统中用于连接外部存储设备(或虚拟存储资源)与文件系统目录树的 “桥梁”,本质是一个普通的目录,但被赋予了特殊功能:通过它可以访问原本不属于当前文件系统的存储资源(如 U 盘、硬盘分区、网络共享盘等)。

6、os.path.exists():(文件 / 目录 / 有效符号链接)路径是否存在

如果路径名是符号链接,则会跟踪链接指向的目标:

  • 如果目标存在,返回True
  • 如果目标不存在(断链),返回False

7、os.path.lexists():(文件 / 目录 / 符号链接)路径是否存在

如果路径名是符号链接,只判断「链接文件」本身是否存在,不去跟踪目标的有效性:

  • 即使是断链(目标不存在),只要链接文件本身存在,就会返回True
  • 如果链接文件被删除,则返回False
FILENAMES = [__file__,os.path.dirname(__file__),'/','./nosuchfile',
]for file in FILENAMES:print('File        : {!r}'.format(file))print('Absolute    :', os.path.isabs(file))print('Is File?    :', os.path.isfile(file))print('Is Dir?     :', os.path.isdir(file))print('Is Link?    :', os.path.islink(file))print('Mountpoint? :', os.path.ismount(file))print('Exists?     :', os.path.exists(file))print('Link Exists?:', os.path.lexists(file))print()>>> 输出结果:
File        : '/Users/mycomputer/test.py'
Absolute    : True
Is File?    : True
Is Dir?     : False
Is Link?    : False
Mountpoint? : False
Exists?     : True
Link Exists?: TrueFile        : '/Users/mycomputer'
Absolute    : True
Is File?    : False
Is Dir?     : True
Is Link?    : False
Mountpoint? : False
Exists?     : True
Link Exists?: TrueFile        : '/'
Absolute    : True
Is File?    : False
Is Dir?     : True
Is Link?    : False
Mountpoint? : True
Exists?     : True
Link Exists?: TrueFile        : './nosuchfile'
Absolute    : False
Is File?    : False
Is Dir?     : False
Is Link?    : False
Mountpoint? : False
Exists?     : False
Link Exists?: False
http://www.dtcms.com/a/362600.html

相关文章:

  • sql执行过程
  • Tomcat 全面指南:从目录结构到应用部署与高级配置
  • Java-Spring入门指南(一)Spring简介
  • WPF曲线自定义控件 - CurveHelper
  • 大模型是如何“学会”思考的?——从预训练到推理的全过程揭秘
  • 【完整源码+数据集+部署教程】PHC桩实例分割系统源码和数据集:改进yolo11-Faster-EMA
  • 无需服务器,免费、快捷的一键部署前端 vue React代码--PinMe
  • 搭建分布式Hadoop集群[2025] 实战笔记
  • 【golang长途旅行第36站】golang操作Redis
  • 【自记】Python 中 简化装饰器使用的便捷写法语法糖(Syntactic Sugar)示例
  • ARM汇编记忆
  • 【53页PPT】华为制造行业数字化转型工业互联网智能制造解决方案(附下载方式)
  • MySQL事务+MVCC(精简版,包教包废)
  • 2025华为最值得入的耳机,真的赢麻了!
  • 结构抗震与土木工程研究
  • SylixOS 下的信号系统
  • Vue 3 + TypeScript 现代前端开发最佳实践(2025版指南)
  • Chrome浏览器调用ActiveX控件之allWebOffice在线编辑控件
  • JD潜在前端二面高频题解析
  • mysql5.6+分页时使用 limit+order by 会出现数据重复问题
  • 蓝桥杯算法之基础知识(5)
  • 基于Spark的新冠肺炎疫情实时监控系统_django+spider
  • 数据结构与算法个人学习代码笔记包含leetcode,海贼oj,蓝桥杯,ACM
  • 华为Fit4:腕间助手,守护你的健康,带你开启智慧生活
  • 【字节拥抱开源】 UXO 团队开源 USO: 通过解耦与奖励学习实现的统一风格与主题驱动生成
  • 2025最新“Java 面试八股文 + 各大厂的面试真题”限时开源
  • 美团 LongCat 开源大模型60 亿参数 MoE 架构,赋能开发者加速 AI 应用落地
  • 本地搭建并使用 Redmine 详细教程
  • CICD 持续集成与持续交付
  • SGLang推理引擎--高效的开源部署方案