导读

os.path 模块主要用于操作文件或目录。例如:

  • 获取文件或目录的属性(元数据):创建时间、上次访问时间、上次修改时间;
  • 获取文件或目录的路径信息:绝对路径、相对路径、多个文件的最长公共路径;
  • 路径规范化、组合与分割:智能组合路径、按文件夹拆分路径、按驱动器与目录拆分路径等。

参考文章(官方文章):Python 3.X 版 os.path 模块; Python 2.X 版 os.path 模块

os.path.abspath(path)

功能:对给定的path进行修正,最终以绝对路径形式返回。 注意:如果指定的path是相对路径,程序会自动补充绝对引用部分,如果path指定为绝对路径,程序直接返回,并不做任何检查。

实例:

>>> os.path.abspath('./')
'/home/vc'
>>> os.path.abspath('./Desktop')
'/home/vc/Desktop'
>>> 
>>> os.path.abspath('/123/321/abc/') # 实际系统不存在此目录
'/123/321/abc'
>>>

os.path.basename(path)

功能:返回path当前目录或文件名称 实例:

>>> os.path.basename('/usr')
'usr'
>>> os.path.basename('/etc/host.conf')
'host.conf'
>>>

os.path.commonpath(paths)

功能:返回给定路径集合中最长且有效的公共路径,注意,如果路径包含绝对路径名和相对路径名,或路径为空,则引发ValueError。 实例:

>>> import os
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
>>>

os.path.commonprefix(list)

功能:返回给定路径集合中最长的公共信息(其不一定是有效路径) list:传入list数据,元素可以是任意字符串

实例:

>>> import os
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'

通过与 commonpath() 方法对比,可见: commonpath() 是以路径为单位,尽可能长匹配,其返回的是有效的路径信息 commonprefix() 是以字符为单位,尽可能长匹配,但其返回的不一定是可用的路径信息。

os.path.dirname(path)

功能:返回给定path的路径信息(不含文件部分)

实例:

>>> os.path.dirname('/usr/local') # 这里的local不认为是目录
'/usr'
>>> os.path.dirname('/usr/local/')
'/usr/local'
>>> os.path.dirname('/uar/local/myfile.txt')
'/uar/local'
>>>

os.path.exists(path)

功能:判断path指向的路径或文件是否真实存在,如果是,返回True,否则为False。 注意:如果path指向的是软链接(symbolic links),当链接可用时返回True,否则返回False。

实例:

>>> os.path.exists('/usr/local') # 真实路径
True
>>> os.path.exists('/usr/local/hu') # 不存在路径
False

>>> os.path.exists('/usr/local/redis-3.2.9.tar.gz') # 该路径下真实存在指定文件
True
>>> os.path.exists('/usr/local/redis-3.2.9.tar') # 路径下不存在指定文件
False

>>> os.path.exists('/usr_link') # 正常软链接(需手动创建)
True
>>> os.path.exists('/broken_link') # 损坏软链接
False
>>>

os.path.lexists(path)

功能:与 exists() 作用相同,但当指向损坏的软链接时,仍返回 True。

实例:

>>> os.path.lexists('/broken_link') # 损坏软链接
True
>>> os.path.exists('/broken_link') # 损坏软链接
False
>>>

os.path.expanduser(path)

功能:自动补充当前user路径信息,当给定的path中含有~符合时,自动补充user路径信息,否者直接返回path。 user 信息来源: Unix 中使用 $HOME 定义的信息,Windows 中使用系统变量 USERPROFILE 或 HOMEDRIVE + HOMEPATH 信息。

(Unix 变量查看方式: echo $HOME ; Windows 查看变量方式: set USERPROFILE ,其它套格式)

实例:

>>> os.path.expanduser('~')
'/home/vc'
>>> os.path.expanduser('~/mydir')
'/home/vc/mydir'
>>>

os.path.expandvars(path)

功能:使用环境变量协助构造path。当传入的path含有$ name 或 ${name} 形式的字符串时,程序会到系统环境下拉取该变量的值进行path补充。 注意:如果传入的格式错误或引用不存在的变量,函数直接返回原有path信息。

实例:

>>> os.path.expandvars('$LOGNAME/home')
'wqt/home'
>>> os.path.expandvars('${LOGNAME}/home')
'wqt/home'
>>> os.path.expandvars('${NOWLOGNAME}/home') # 引用不存在变量
'${NOWLOGNAME}/home'
>>>

os.path.getatime(path)

功能:返回上次访问path的时间,以浮点数返回。注:如果path(文件/目录)不存在或无法访问,则触发FileNotFoundError异常。

实例:

>>> import os
>>> from time import asctime, localtime
>>> os.path.getatime('myredis') # 目录
1562743972.8064969
>>> asctime(localtime(1562743972.8064969)) # 转换
'Wed Jul 10 15:32:52 2019'

>>> os.path.getatime('myfile.py') # 文件
1562752140.3732224
>>> asctime(localtime(1562752140.3732224)) 
'Wed Jul 10 17:49:00 2019'
>>>

os.path.getmtime(path)

功能:与 getatime() 类似,但这里返回的是对 path 上次修改的时间。

实例:

>>> import os
>>> from time import asctime, localtime
>>> os.path.getmtime('myredis') # 目录
1562570699.8652778
>>> os.path.getmtime('myfile.py') # 文件
1562752140.3732224
>>>

os.path.getctime(path)

功能:返回path的ctime时间值(以浮点数返回)。在Unix上ctime为path最后修改的时间,在Windows上ctime为path的创建时间。path可以是文件或文件夹。

实例:

>>> import os
>>> from time import asctime, localtime
>>> os.path.getctime('abc') # Unix 表示修改时间,Windows 表示创建时间
1562809745.724874
>>> asctime(localtime(1562809745.724874))
'Thu Jul 11 09:49:05 2019'
>>>

os.path.getsize(path)

功能:返回path的大小,单位为字节。实际上getsize() 只能直接返回单个文件的大小,如果需要计算path文件夹的大小,还需另行操作,如遍历目录树,将文件大小相加再返回。

实例 1 :

>>> os.path.getsize('myfile.py')
2072
>>>

实例 2:

# 储存为.py 文件再执行

# coding:utf-8

import os

file_list = []
def get_all_file(path):
    li = os.listdir(path)
    for p in li:
        pathname = os.path.join(path, p)
        if not os.path.isfile(pathname):
            get_all_file(pathname)
        else:
            file_list.append(pathname)

def count_file_size(file_list):
    total_size = 0
    for file in file_list:
        total_size += os.path.getsize(file)
    return total_size

if __name__ == '__main__':
    path = './'
    get_all_file(path)
    print(count_file_size(file_list))

# 执行 .py 文件,计算指定目录(这里指定为当前目录)总文件大小(单位: 字节)

os.path.isabs(path)

功能:判断path是否为绝对路径,是:True, 不是:False。

实例:

>>> os.path.isabs('abc')
False
>>> os.path.isabs('/etc') # Linux
True
>>> os.path.isabs('C:/Users') # Windows
True

os.path.isfile(path)

功能:判断 path 是否为文件,是:返回 True,不是:返回 False。 注:如果 path 是软链接(symbolic links)且正常,则根据指向目标的类型返回 TrueFalse ,如果软链接不可用,则返回 False

实例:

>>> os.path.isfile('abc.txt')
True
>>> os.path.isfile('abc_link') # abc_link 是 abc.txt的软链接
True
>>> os.path.isdir('abc') # 不是文件
False
>>> os.path.isdir('test_link') # 不可用软链接
False
>>>

os.path.isdir(path)

功能:判断 path 是否为文件夹,是:返回 True,不是:返回 False。 注:如果 path 是软链接(symbolic links)且正常,则根据指向目标的类型返回 TrueFalse,如果软链接不可用,则返回 False

实例:

>>> os.path.isdir('abc')
True
>>> os.path.isdir('abc_link') # abc_link 是 abc 的软链接
True
>>> os.path.isdir('abc.txt')
False
>>>

os.path.islink(path)

功能:如果 path 是软链接(不管是否可用),返回 True,否则返回 False(此命令在 Windows 上测试未通过)。

实例:

>>> os.path.islink('abc_link') # abc_link 是文件夹 abc 的软链接
True
>>> os.rename('abc', 'newabc') # 重命名 abc 为 newabc ,使 abc_link 失效
>>> os.path.islink('abc_link')
True
>>> os.path.islink('newabc')
False
>>>

os.path.ismount(path)

功能:判断 path 是否为挂载点,如果是,则返回 True ,否则返回 False

实例:

>>> os.path.ismount('/dev') # Linux
True
>>> os.path.ismount('C:/') # Windows
True
>>>

os.path.join(path, *paths)

功能:路径拼接,将传入的一个或多个 path 进行拼接。

实例: # Linux 下演示实例

>>> os.path.join('aa') # 单个,直接输出
'aa'
>>> os.path.join('aa', 'bb') # 多个目录,且不含根目录的,直接拼接所有
'aa/bb'
>>> os.path.join('aa', 'bb', 'file1.txt') # 同上
'aa/bb/file1.txt'
>>> os.path.join('aa', '/bb', 'file1.txt') # 有且仅有一根目录的,从根目录开始往后拼接
'/bb/file1.txt'
>>> os.path.join('aa', '/bb', '/cc', 'file1.txt') # 存在多个根目录的,从最右(后)一个根目录开始,往后拼接所有
'/cc/file1.txt'
>>> os.path.join('aa', '/bb', './cc', 'file1.txt') # 含有当前目录的,将当前目录(.)拆分,再往后拼接,其它准则参照上述。
'/bb/./cc/file1.txt'
>>> os.path.join('aa', '/bb', '~/cc', 'file1.txt') # 含有用户目录的,将用户目录(.)拆分,再往后拼接,其它准则参照上述。
'/bb/~/cc/file1.txt'
>>>

os.path.normcase(path)

功能:规范化路径名的大小写。在 Windows 上,将路径名中的所有字符转换为小写,并将正斜杠 / 转换为反斜杠 \ 。其它系统的直接返回。

实例:

>>> os.path.normcase('C:/Users/VC/Desktop/123') # Windows
'c:\\users\\VC\\desktop\\123'

>>> os.path.normcase('/usr/local/bin') # Linux
'/usr/local/bin'
>>>

os.path.normpath(path)

功能:规范化路径,通过折叠(去重)的方式返回最优路径信息。 注意:Windows下会将斜杠 / 转换为反斜杠 \ ,但大小写不会改变,如需改变大小写,可调用 normcase()方法。

实例:

>>> # Linux 环境
>>> os.path.normpath('/usr/local/./bin')
'/usr/local/bin'
>>> os.path.normpath('/usr/local/../src')
'/usr/src'
>>> os.path.normpath('/usr/local//src')
'/usr/local/src'

>>> # Windows 环境
>>> os.path.normpath('C:/Windows/./System32')
'C:\\Windows\\System32'
>>> os.path.normpath('C:/Windows/../System')
'C:\\System'
>>> os.path.normpath('C:/Windows/System32//drivers')
'C:\\Windows\\System32\\drivers'

os.path.realpath(path)

功能:返回 path (文件/目录)的绝对路径。

实例:

>>> os.path.realpath('abc.txt') # Linux
'/home/wqt/abc.txt'

>>> os.path.realpath('QzoneExporter-master.zip') # Windows
'C:\\Users\\VC\\Desktop\\123\\QzoneExporter-master.zip'

os.path.relpath(path, start=os.curdir)

功能:返回 path 的相对路径,相对起使目录为 start 指定目录,缺省时,默认为当前工作目录。

实例:

>>> os.path.relpath('abc/aa/bb', start='~')
'../abc/aa/bb'
>>> os.path.relpath('abc/aa/bb', start='/')
'home/vc/abc/aa/bb'
>>> os.path.relpath('abc/aa/bb', start='abc')
'aa/bb'
>>>

os.path.samefile(path1, path2)

功能:判断文件或目录是否相同,是:返回 True ,否:返回 False 。如果目标不存在或不可访问,则报异常。

实例:

>>> os.path.samefile('abc.txt', './abc.txt') # 文件
True
>>> os.path.samefile('mydir', './mydir') # 目录
True
>>>

os.path.sameopenfile(fp1, fp2)

功能:判断 fp1 和 fp2 是否指向同一文件,是:True,否:False

实例: (暂略)

os.path.samestat(stat1, stat2)

功能:判断 stat1和 stat2 是否引用于同一个文件,是:True

实例: (暂略)

os.path.split(path)

功能:将path拆分为一对(head, tail)的元组,其中 tail 是 path 的最后一个文件或目录名;head 是除 tail 外的路径信息。 如果 path 中没有斜杠,则 head 将为空。 如果 path 以斜线结尾,则 tail 将为空。 如果 path 为空,则 head 和 tail 都为空。

实例:

>>> os.path.split('abc')
('', 'abc')
>>> os.path.split('abc/')
('abc', '')
>>> os.path.split('abc/test.txt')
('abc', 'test.txt')
>>> os.path.split('./abc/test.txt')
('./abc', 'test.txt')
>>> os.path.split('/abc/aa/test.txt')
('/abc/aa', 'test.txt')
>>>

os.path.splitdrive(path)

功能:将 path 拆分为一对 (drive,tail) 的元组,其中 drive 是驱动器(挂载点/盘符)或空字符串。在不使用驱动器标注的系统上(如:Linux),drive 始终为空字符串。此方法主要针对 Windows 使用。

实例:

>>> os.path.splitdrive('abc/aa.txt') # Linux
('', 'abc/aa.txt')

>>> os.path.splitdrive('C:/Users/VC/Desktop/123/QzoneExporter-master.zip') # Windows
('C:', '/Users/VC/Desktop/123/QzoneExporter-master.zip')

os.path.splitext(path)

功能:将 path 拆分为一对 (root, ext) 的元组,root 是路径名,ext 是文件扩展名,如果 path 均由目录组成,则 ext 为空。 PS: root + ext 永远等于 path。

实例:

>>> os.path.splitext('abc/aa.txt')
('abc/aa', '.txt')
>>> os.path.splitext('abc/bb')
('abc/bb', '')
>>>

os.path.supports_unicode_filenames

功能:设置是否支持unicode路径名

最后修改:2022 年 06 月 07 日
如果觉得我的文章对你有用,请随意赞赏