Python os.path模块的使用_os.path.relpath-程序员宅基地

技术标签: os.path比较两个路径或文件是否相同  os.path对路径或文件的判断  os.path获取路径  Python/PYPI  Python os.path模块的使用  os.path拼接或拆分路径  

Python os.path模块的使用

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是不是同一个文件的状态信息。

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43790276/article/details/98674379

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签