Python的os模块是一个对接操作系统的模块,当我们需要对路径进行操作时,可以使用os.path。
os.path模块实现了很多处理长文件名,长路径名的函数,可以用来对路径切分,拼接,转换等。
先导入os模块,然后就可以使用 os.path 模块了。
一、os.path获取路径
# coding=utf-8
import os
# 返回当前位置的绝对路径
print(os.getcwd())
print(os.path.abspath('.'))
# 返回path的真实路径
print(os.path.realpath('..'))
# 返回从start开始计算的相对路径
print(os.path.relpath('.', '/home/python/Desktop'))
运行结果:
/home/python/Desktop/python_demo/os_test
/home/python/Desktop/python_demo/os_test
/home/python/Desktop/python_demo
python_demo/os_test
在本文中,运行的系统是Linux系统,当然,这些方法在windows下全部都是可以使用的,只要传入正确的值就行。
一开始,我使用os.getcwd()打印了当前所在的绝对路径: /home/python/Desktop/python_demo/os_test,当前的位置是根目录下的用户家目录下的python用户的桌面下的python_demo下的os_test目录中,上面运行的代码写在os_path_demo.py文件中。这很简单,但这是本文所有运行结果的前提,所以先说明一下。
os.path.abspath(path) 返回path的绝对路径,传入 . 和 .. 也可以,分别会返回当前路径和上级目录的绝对路径。
os.path.realpath(path) 返回path的真实路径,与abspath(path)的结果相同。
os.path.relpath(path, start) 返回path相对于start的相对路径,也就是从start目录找到path的路径。
二、os.path对路径进行处理
# 返回文件夹的名字或文件名
print(os.path.basename('./os_path_demo.py'))
print(os.path.basename('/home/python/Desktop/python_demo/os_test'))
# 返回多个路径共有的最长的路径
print(os.path.commonpath(['/home/python/Desktop/python_demo/os_test', '/home/python/Desktop/python_demo']))
# 返回文件夹或文件所在的路径(可能会有问题)
print(os.path.dirname('/home/python/Desktop/python_demo/os_test/os_path_demo.py'))
# 返回路径是否存在
print(os.path.exists('/home/python/Desktop/python_demo/os_test'))
print(os.path.lexists('/home/python/Desktop/python_demo/os_test'))
# 把路径中的“~”转换成用户目录(可能会有问题)
print(os.path.expanduser('~/Desktop/python_demo/os_test'))
# 把路径中的环境变量换成路径 env export
print(os.path.expandvars('${SHELL}'))
运行结果:
os_path_demo.py
os_test
/home/python/Desktop/python_demo
/home/python/Desktop/python_demo/os_test
True
True
/home/python/Desktop/python_demo/os_test
/bin/bash
os.path.basename(path) 返回当前目录的名字或文件名,结果是path的最后一个斜杠后的字符串。
os.path.commonpath([path1, path2]) 返回两个路径path1和path2的共同路径中最长的路径。如果有父子目录的关系,则返回父目录。这里传入的参数是一个列表,也就是说,如果比较的不只两个路径,而是多个,只要将路径加到列表中,也可以完成比较。
os.path.dirname(path) 返回文件夹或文件所在的路径,结果是path最后一个斜杠前的字符串,这与basename()刚好相反。不过这里需要注意,如果传入的路径是一个不存在的路径,也会返回结果,因为这个方法其实只是对传入的路径字符串进行截取,并不判断系统中是否有此路径。所以在传值时,要保证传入的是一个正确的路径。
os.path.exists(path) 返回系统中是否真正存在路径path。
os.path.lexists(path) 结果与exists()相同。
os.path.expanduser(path) 传入的path以~开头, 该方法会自动将~替换成当前用户的用户目录,如:/home/python。这里的用户是当前用户,如果换了用户,则用户目录也跟随改变。使用这个方法也需要注意,传入不存在的路径,方法不能识别,因为这个方法只是对字符~进行替换,并不判断系统中是否有此路径。所以传值时,要保证传入的是一个正确的路径,刚好,可以使用exists()来判断。
os.path.expandvars(path) 传入的path中包含了系统的环境变量,格式为 ${name} ,该方法会自动将环境变量替换成指向的路径。如果是不存的环境变量,则返回的是原样的字符串。同样,此方法也不能判断路径的真实性,我们在传入路径和环境变量时,要保证传入的路径和环境变量正确。获取系统有哪些环境变量可以在终端使用env命令或export命令查看。
三、os.path对路径或文件的判断
# 返回路径是否为绝对路径(可能会有问题)
print(os.path.isabs('Desktop/python_demo/os_test'))
# 返回是不是文件
print(os.path.isfile('Desktop/python_demo/os_test'))
print(os.path.isfile('./os_path_demo.py'))
# 返回是不是目录
print(os.path.isdir('.'))
print(os.path.isdir('./os_path_demo.py'))
# 判断是不是链接
print(os.path.islink('./os_path_demo.py'))
# 判断是不是挂载点 df -a
print(os.path.ismount('/dev'))
运行结果:
False
False
True
True
False
False
True
os.path.isabs(path) 返回path是不是绝对路径。这个方法只是判断path的开头的是不是以斜杠开头,没有判断path是不是真的存在,所以传入path时要保证正确。
os.path.isfile(path) 返回path是不是文件,如果path的结束是一个文件,则返回True,否则返回False。
os.path.isdir(path) 返回path是不是路径,与isfile()相反。
os.path.islink(path) 返回path是不是链接,如果path的结束是一个链接,则返回True,否则返回False。
os.path.ismount(path) 返回path是不是挂载点,如果path是一个挂载点,则返回True,否则返回False。查看当前系统的挂载点可以使用 df -a 命令查看。
四、os.path拼接或拆分路径
# 把目录和文件名合成一个路径
print(os.path.join('Desktop/python_demo/os_test', 'os_path_demo.py'))
# 把路径切割成目录和文件名
print(os.path.split('/home/python/Desktop/python_demo/os_test/os_path_demo.py'))
# 返回驱动器名和路径组成的元组
print(os.path.splitdrive('/home/python/Desktop/python_demo/os_test/os_path_demo.py'))
# 返回路径名和扩展名(文件后缀)的元组
print(os.path.splitext('/home/python/Desktop/python_demo/os_test/os_path_demo.py'))
运行结果:
Desktop/python_demo/os_test/os_path_demo.py
('/home/python/Desktop/python_demo/os_test', 'os_path_demo.py')
('', '/home/python/Desktop/python_demo/os_test/os_path_demo.py')
('/home/python/Desktop/python_demo/os_test/os_path_demo', '.py')
os.path.join(path, file) 返回目路径的真实性。录和文件名拼接后的路径。这里只是做拼接,没有判断路径是否真的存在,所以传入参数时要注意
os.path.split(path) 与join()相反,将path切分成目录和文件名,结果是一个元组。
os.path.splitdrive(path) 返回驱动器名和路径名,结果是一个元组。
os.path.splittext(path) 返回文件名和文件后缀名,结果是一个元组。
五、os.path返回文件的访问时间和大小
# 返回最近访问时间
print(os.path.getatime('./os_path_demo.py'))
print(os.path.getmtime('./os_path_demo.py'))
print(os.path.getctime('./os_path_demo.py'))
# 返回文件的大小
print(os.path.getsize('./os_path_demo.py'))
运行结果:
1565794870.657664
1565794870.5253758
1565794870.5253758
3176
os.path.getatime(file) 返回文件的最近访问时间戳。
os.path.getmtime(file) 返回文件的最近修改时间戳。
os.path.getctime(file) 返回文件的创建时间戳。
os.path.getsize(file) 返回文件的大小,如果文件不存在,会报错。
六、os.path比较两个路径或文件是否相同
# 判断目录或文件是否相同
print(os.path.samefile('.', '/home/python/Desktop/python_demo/os_test'))
print(os.path.samefile('os_path_demo.py', '/home/python/Desktop/python_demo/os_test/os_path_demo.py'))
fd = os.open('os_path_demo.py', os.O_RDONLY)
fd2 = os.open('os_path_demo.py', os.O_RDONLY)
print(fd)
print(fd2)
# 判断两个文件描述符是否指向同一个文件
print(os.path.sameopenfile(3, 4))
stat = os.stat('os_path_demo.py')
stat2 = os.lstat('os_path_demo.py')
print(stat)
print(stat2)
# 判断两个star是否指向同一个文件
print(os.path.samestat(stat, stat2))
运行结果:
True
True
3
4
True
os.stat_result(st_mode=33204, st_ino=656046, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=3157, st_atime=1565711348, st_mtime=1565711348, st_ctime=1565711348)
os.stat_result(st_mode=33204, st_ino=656046, st_dev=2049, st_nlink=1, st_uid=1000, st_gid=1000, st_size=3157, st_atime=1565711348, st_mtime=1565711348, st_ctime=1565711348)
True
os.path.samefile(path1, path2) 判断两个目录或文件是不是同一个目录或文件。
os.path.sameopenfile(fd1, fd2) 判断文件描述符fd1和fd2是不是指向同一个文件。
os.path.samestat(stat1, stat2) 判断文件状态stat1和stat2是不是同一个文件的状态信息。