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

智能推荐

nvl函数不生效(bug记录)_nvl函数没用-程序员宅基地

文章浏览阅读197次。nvl(表达式A,表达式B)_nvl函数没用

前端配置环境_vscode已为屏幕阅读器优化-程序员宅基地

文章浏览阅读965次。Sublime配置软件安装点击官网下载插件安装新版的sublime已经默认安装了package control,我们可以通过package control 安装适合自己的插件。如果没有安装package control,直接按command + shift + p 唤出命令列表,(windows用户把command键改为crtl键)输入install,点击install package control,耐心等待安装好package control会有弹框提示。以下三步为安装插件的方法:在s_vscode已为屏幕阅读器优化

快乐学Python,数据分析之使用爬虫获取网页内容_python获取鼠标下网页内容-程序员宅基地

文章浏览阅读1.6k次,点赞32次,收藏19次。造成这个现象的原因是豆瓣电视剧网页中的电视剧列表的部分是动态加载的,所以我们用 urllib3 去直接下载,只能下载到一个壳网页,没有里面的列表内容。对于煎蛋这类普通网页,urllib3 可以表现更好,但是有一种类型的网页,它的数据是动态加载的,就是先出现网页,然后延迟加载的数据,那 urllib3 可能就有点力不从心了。动态网页应该怎么抓取呢?执行上述代码,可以看到打印出了非常多的内容,而且很像我们第一部分手动保存的网页,这说明目前 html_content 变量中保存的就是我们要下载的网页内容。_python获取鼠标下网页内容

加密解密(三)--Java中的非对称加密算法_publickey.getencoded()多出一部分-程序员宅基地

文章浏览阅读911次。非对称加密算法是一种密钥的保密方法。非对称加密算法需要两个密钥:公开密钥(public key)和私有密钥(private key)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程_publickey.getencoded()多出一部分

通往未来的数字大道:解读政府工作报告中的计算机行业发展路径-程序员宅基地

文章浏览阅读539次,点赞15次,收藏10次。政府工作报告作为政府工作的全面总结和未来规划,不仅反映了国家整体的发展态势,也为各行各业提供了发展的指引和参考。随着信息技术的快速发展,计算机行业已经成为推动经济社会发展的重要引擎之一。因此,从政府工作报告中探寻计算机行业的发展趋势、政策导向和未来机遇,对于行业内的企业和从业者来说具有重要的指导意义。

SSL编程指南_sslv23-程序员宅基地

文章浏览阅读1.3w次,点赞16次,收藏83次。本文将介绍如何使用openssl APIs 实现一个简单的SSL 客户端和服务端虽然SSL客户端和服务端在创建和配置上有所区别,但它们本质上的步骤可以总结为如下图,具体步骤将在后面章节介绍:初始化SSL库在SSL应用程序中调用其他Openssl APIs,需要先用下面的APIs进行初始化:SSL_library_init(); /* 为SSL加载加密和哈希算法 */_sslv23

随便推点

GPT-3 模型-程序员宅基地

文章浏览阅读261次。GPT-3 (Generative Pre-training Transformer 3) 是由 OpenAI 开发的一种大型语言生成模型。它可以用来进行文本生成、翻译、问答等任务。GPT-3 使用了 Transformer 架构,并在大量的网络数据上进行了预训练,使其能够从历史数据中学习到语言的结构和模式。GPT-3 具有非常强大的生成能力,能够生成高质量的人类-like 文本。它目前是市面上规..._gpt-3模型

【嵌入式开发】481-程序员宅基地

文章浏览阅读704次,点赞13次,收藏6次。在嵌入式开发中,I2C(Inter-Integrated Circuit)总线常用于连接微控制器与各种外围设备,其中EEPROM(Electrically Erasable Programmable Read-Only Memory,电可擦除可编程只读存储器)是I2C总线上常见的存储器件之一。读写EEPROM时,主设备首先发送起始信号,然后发送EEPROM的设备地址和读写位。在实际使用中,开发者需要根据具体的EEPROM型号和数据手册来确定正确的地址、页大小和读写时序等参数。在上述代码中,我们定义了。

oracle rac 内存耗尽,粗浅记录Oracle RAC系统内存无法释放-程序员宅基地

文章浏览阅读536次。交代一下环境,是现网实时生产数据库主机。Hp-ux 11.31+Oracle10.2.0.4.0 RAC集群。两台机器户外RAC,essdb3与essdb4两台机器。物理内存128G,SGA分配64G,PGA分配5G。早上发现essdb4主机glance运行只有6G的空闲内存。使用如下命令进行简单分析:sql> select distinct sid from v$mystat; 得到sid...

x86汇编 linux,Linux操作系统的X86汇编程序设计-程序员宅基地

文章浏览阅读252次。本质上来说, 这篇文章是把我最感兴趣的两样编程东西: Linux 操作系统和汇编语言程序设计结合在一起. 这两个都不(或者说应该不)需要介绍; 像 Win32 的汇编,Linux 的汇编运行在 32 位的保护模式下...但它又有一个截然不同的优势就是它允许你调用 C 的标准库函数和 Linux 的共享库函数。 我开始给 Linux 下的汇编语言编程来个简要介绍; 为了更好读一点, 你可能要跳过这个..._精简32位linux操作系统在x86上的设计与实现

kimi 初体验_kimi api-程序员宅基地

文章浏览阅读1.2k次,点赞6次,收藏5次。国产kimi 来了,它的一个优点是使用openai api。不需要虚拟卡充值等麻烦了。_kimi api

如何将word图片粘贴到帝国CMS里面-程序员宅基地

文章浏览阅读61次。/在ctrl+c word中的文字或者图片之后会返回1种(image/png)或者4种type(text/plain,text/html,text/rtf,image/png)类型的对象。//如下代码:e.originalEvent.clipboardData.items获得剪贴板的内容。//如果有文字的话不做任何的处理,如果只粘贴图片的话文本一定是空的,包括复制的桌面图片或者截图的图片。//当粘贴了文本之后text是不为空的,同时也会返回当前文本的图片类型。//为了兼容4种格式的情况,做了如下的判断。

推荐文章

热门文章

相关标签