首页 > 编程语言 >忘掉python的os.path吧,pathlib巨好用

忘掉python的os.path吧,pathlib巨好用

时间:2023-01-30 17:31:51浏览次数:46  
标签:巨好 python 路径 pathlib Path home path os


1. pathlib 取代os.path模块

从python3.4开始,pathlib正式成为标准库,旨在取代老旧的os.path模块和一些os模块中对系统路径的操作。pathlib提供了表示文件系统路径的类,而os.path提供的是各种操作路径的函数,如果你已经熟练的掌握了os.path,那么学习pathlib将非常容易。

从使用情况来看,pathlib的功能对编程人员更加友好,对系统路径的操作更便捷。

2. 纯路径与具体路径

下图是pathlib所提供的类的继承关系

忘掉python的os.path吧,pathlib巨好用_后缀

纯路径与具体路径的区别在于,具体路径类可以对系统路径进行I/O操作,而纯路径则不可以,那么纯路径类能做什么呢?纯路径类可以对路径进行计算,这种计算不涉及I/O操作,比如获得文件的后缀

from pathlib import PurePath

path = PurePath('/home/root/1.txt')
suffix = path.suffix
print(suffix) # .txt

获得文件路径的后缀,纯粹是一个字符串计算的操作,不涉及到I/O操作,如果你对路径的操作都属于这种类型的,那么用纯路径类就可以。那么,具体路径的所谓I/O操作是什么呢,举一个简单的例子,判断路径是否存在。想要判断一个路径是否存在,就一定需要访问操作系统,只有操作系统才知道一个路径是否存在。在上面的代码里,你不能用path对象去调用exists方法,因为PurePath类根本没有这个方法,你需要使用Path类才可以

from pathlib import Path

path = Path('/home/root/1.txt')
suffix = path.suffix
print(suffix) # .txt
print(path.exists()) # False

PurePath 是Path的父类,因此如果你分不清该用纯路径类还是具体路径类,那么使用Path类就好了。至于PosixPath 和 WindowsPath,如果你也分不清应当依据什么进行选择,那就不要选了,一劳永逸的选择Path就好了,python会根据你的系统自动为你选择。上面的代码,如果在windows平台上执行,path.__class__ 的值是pathlib.WindowsPath, 如果是在linux系统上执行,path.__class__ 的值是pathlib.PosixPath。

3. pathlib方法与os.path函数对照关系

如果你对os.path比较熟悉,那么在学习pathlib时,可以参考下表中方法与函数的对照关系

os 和 os.path

pathlib

​os.path.abspath()​

​​Path.resolve()​​

​os.chmod()​

​​Path.chmod()​​

​os.mkdir()​

​​Path.mkdir()​​

​os.rename()​

​​Path.rename()​​

​os.replace()​

​​Path.replace()​​

​os.rmdir()​

​​Path.rmdir()​​

​os.remove()​​​, ​​os.unlink()​

​​Path.unlink()​​

​os.getcwd()​

​​Path.cwd()​​

​os.path.exists()​

​​Path.exists()​​

​os.path.expanduser()​

​​Path.expanduser()​​ 和 ​​Path.home()​​

​os.path.isdir()​

​​Path.is_dir()​​

​os.path.isfile()​

​​Path.is_file()​​

​os.path.islink()​

​​Path.is_symlink()​​

​os.stat()​

​​Path.stat()​​, ​​Path.owner()​​, ​​Path.group()​​

​os.path.isabs()​

​​PurePath.is_absolute()​​

​os.path.join()​

​​PurePath.joinpath()​​

​os.path.basename()​

​​PurePath.name​​

​os.path.dirname()​

​​PurePath.parent​​

​os.path.samefile()​

​​Path.samefile()​​

​os.path.splitext()​

​​PurePath.suffix​​

4. 用的比较爽的方法

4.1 获得上层文件夹

在工程上,你可能需要通过当前的一个已知路径,向上回去几层,去定位一个文件夹或者文件,比如给定一个路径 /home/root/python/1.txt,向上回溯两层,得到的路径是/home/root,使用os.path模块,你可以这样编写代码

path = os.path.dirname('/home/root/python/1.txt')
path = os.path.dirname(path)
print(path)

向上回溯N层,需要调用N次dirname函数,着实麻烦,如果用pathlib,简直不要太简单

from pathlib import Path

path = Path('/home/root/python/1.txt')
print(path.parents[1]) # /home/root

回溯3层,取path.parents[2]即可,怎么样,是不是方便了许多。

4.2 遍历文件夹及其子文件夹

使用os.walk函数,可以实现对文件夹的深层遍历

for dir_path,subpaths,files in os.walk('./',False):
for file in files:
file_path = os.path.join(dir_path,file)
if file_path.endswith(".py"):
print(file_path)

上面的代码,可以输出当前目录下所有的文件夹和文件,如果只想要某种后缀的文件,那么需要你对file_path的后缀进行判断,而使用Path的glob方法,将更加容易。

py_files = path.glob("**/*.py")
for filename in py_files:
print(filename)

“**” 是递归通配符,意味着对当前目录和子目录进行递归遍历,*.py 会匹配所有以.py结尾的文件路径。


标签:巨好,python,路径,pathlib,Path,home,path,os
From: https://blog.51cto.com/u_15948370/6027511

相关文章

  • python web框架多进程部署下数据库连接问题
    python常用的web框架,诸如flask,django,在生产部署时,都会选择多进程的部署方式,选用的中间件多为uwsgi或者gunicorn。如果项目里使用了数据库,那么就要考虑数据库连接在多进程下......
  • python使用正则表达式实现字符串替换
    python的字符串提供了replace方法,可以将子串替换成其他字符串,例如下面的代码name='flask_script'name=name.replace('_','-')print(name)#flask-script替换的前提......
  • C++子线程中调用python代码
    项目需要C++调用python的算法,由于python算法比较耗时,因此采用在C++里启动workingthread来调用python脚本,python代码里含有cv2.imread()等opencv的调用,在子线程里调用会卡......
  • 【Python笔记2.1】Python Unicode字符编解码
    以下部分参考[1],这里复制了其中一部分是为了防止原文被移动或删除。概述Python中有字符串类型(str)和字节类型(byte),以及Python编码中最常见也是最顽固的两个错误:Unic......
  • 【Python笔记2.2】用zipfile解压zip包时遇到的Unicode字符编解码问题
    pythonunicode字符编解码问题参见【Python笔记2.1】python中用zipfile解压zip包网上资料一堆,这里就不多说了。下面使用【Python笔记2.1】中总结出来的字符编解码函数......
  • 【KAWAKO】python查看内存空间占用情况
    目录查看变量的内存占用查看运行内存占用查看变量的内存占用importsysc=1145.114print(sys.getsizeof(c))查看运行内存占用importpsutilmemory=psutil.vir......
  • python实用小技之数据结构
     本文大多数例子搬自pythoncookbook这里是对学习的一个总结和提炼ps:python版本为python3 1.解压序列赋值给多个变量#有一个包含N个元素的元组或者是序列,怎样将......
  • python 中异常类型总结
    异常类型:异常名称描述BaseException       所有异常的基类SystemExit          解释器请求退出KeyboardInterrupt    用户中断......
  • python实战-基于正交实验(工具:allpairs)自动生成接口异常测试用例
    实现思路1.抓取api信息(目前公司用的swagger),uri、method、params、response,解析完成后写入excle2.读取抓取完毕的api信息,处理为allpairs所需要的ordereddict3.调用allpai......
  • python之路60 drf从入门到成神 1
    老刘讲课资料获取#个人博客:https,证书过期,忽略-https://www.liuqingzheng.top/#cnblogs博客(后期迁移到这里,高级部分的内容)-https://www.cnblogs.com/liuqin......