您现在的位置是:网站首页> 编程资料编程资料

python3利用pathlib替代os.path的方法实例_python_

2023-05-26 427人已围观

简介 python3利用pathlib替代os.path的方法实例_python_

前言

如果你还在为操作文件路径烦恼,不会使用os.path模块,那么是时候试试pathlib了。

pathlib 库

pathlib 库从 python3.4 开始,到 python3.6 已经比较成熟。如果你的新项目可以直接用 3.6 以上,建议用 pathlib。相比于老式的 os.path 有几个优势:

  • 老的路径操作函数管理比较混乱,有的是导入 os, 有的又是在 os.path 当中,而新的用法统一可以用 pathlib 管理。
  • 老用法在处理不同操作系统 win,mac 以及 linux 之间很吃力。换了操作系统常常要改代码,还经常需要进行一些额外操作。
  • 老用法主要是函数形式,返回的数据类型通常是字符串。但是路径和字符串并不等价,所以在使用 os 操作路径的时候常常还要引入其他类库协助操作。新用法是面向对象,处理起来更灵活方便。
  • pathlib 简化了很多操作,用起来更轻松。

常用的 pathlib 和 os 对比图

操作os and os.pathpathlib
绝对路径os.path.abspathPath.resolve
修改权限os.chmodPath.chmod
创建目录os.mkdirPath.mkdir
重命名os.renamePath.rename
移动os.replacePath.replace
删除目录os.rmdirPath.rmdir
删除文件os.remove, os.unlinkPath.unlink
工作目录os.getcwdPath.cwd
是否存在os.path.existsPath.exists
用户目录os.path.expanduserPath.expanduser and Path.home
是否为目录os.path.isdirPath.is_dir
是否为文件os.path.isfilePath.is_file
是否为连接os.path.islinkPath.is_symlink
文件属性os.statPath.stat, Path.owner, Path.group
是否为绝对路径os.path.isabsPurePath.is_absolute
路径拼接os.path.joinPurePath.joinpath
文件名os.path.basenamePurePath.name
上级目录os.path.dirnamePurePath.parent
同名文件os.path.samefilePath.samefile
后缀os.path.splitextPurePath.suffix

pathlib 获取文件路径

Path.cwd 获取当前文件夹路径

需注意的是,返回的不是字符串,而是 WindowsPath 对象

from pathlib import Path # 1.可以直接调用类方法.cwd() print(Path.cwd()) # C:\Users\dell\PycharmProjects\untitled3\demo # 2.也可以实例化后调用 p = Path('./') print(p.cwd()) # C:\Users\dell\PycharmProjects\untitled3\demo print(type(p.cwd())) # 

获取当前文件路径

from pathlib import Path # 当前文件路径 p = Path(__file__) print(p)

获取 Path 对象绝对路径

from pathlib import Path # 当前文件路径 p = Path('data.json') print(p) # data.json 对象 print(p.absolute()) # C:\Users\dell\PycharmProjects\untitled3\demo\data.json

一些常用的获取文件属性

from pathlib import Path # 当前文件路径 p = Path(__file__) print(p.absolute()) # 获取绝对路径 print(p.resolve()) # 获取绝对路径 print(p.name) # 获取文件名称 'a1117.py' print(p.stem) # 只要文件名,不要后缀 a1117 print(p.suffix) # 获取文件 后缀.py print(p.suffixes) # 文件所有的猴子 ['.py'] print(p.parts) # 拆分('C:\\', 'Users', 'dell', 'PycharmProjects', 'untitled3', 'demo', 'a1117.py') print(p.parent) # C:\Users\dell\PycharmProjects\untitled3\demo print(p.parent.parent) # C:\Users\dell\PycharmProjects\untitled3 print(p.parents) # 所有的父级  print(p.anchor) # 锚,目录前面的部分 C:\ 或者 /

获取上层,上上层目录

from pathlib import Path # .parent 获取上一层 print(Path.cwd().parent) # 实例化后调用 .parent p = Path('./') print(p.cwd().parent)

获取上上层使用链式方法调用 .parent.parent

from pathlib import Path # .parent 获取上一层 print(Path.cwd().parent.parent) # 实例化后调用 .parent p = Path('./') print(p.cwd().parent.parent)

获取用户home目录

from pathlib import Path print(Path.home()) # c:\Users\dell

判断文件,文件夹

is_file()判断是不是文件

from pathlib import Path # 1. is_file() 判断是不是文件 print(Path.cwd().is_file()) # False # 2.也可以实例化后调用 p = Path('./data.json') print(p.is_file()) # True

is_dir() 判断是否是文件夹

from pathlib import Path # 1. is_file() 判断是不是文件 print(Path.cwd().is_dir()) # True # 2.也可以实例化后调用 p = Path('./data.json') print(p.is_dir()) # False

exists() 判断文件 或文件夹是否存在

from pathlib import Path # exists() 判断是否存在 p = Path('./data.json') print(p.exists()) # True or False

is_absolute() 判断是否是绝对路径

from pathlib import Path # 当前文件路径 p = Path(__file__) print(p) print(p.is_absolute()) # True

joinpath 拼接目录

可以用类似 os.path.join 的方法

from pathlib import Path # 当前文件路径 p = Path('./') print(p.absolute()) # C:\Users\dell\PycharmProjects\untitled3\demo print(p.joinpath('data.json')) # data.json print(p.joinpath('data.json').absolute()) # C:\Users\dell\PycharmProjects\untitled3\demo\data.json # 拼接多层 print(p.joinpath('files', 'data.json')) # files\data.json print(p.joinpath('files', 'data.json').absolute()) # C:\Users\dell\PycharmProjects\untitled3\demo\files\data.json

pathlib 支持用 / 拼接路径, 这种语法估计用的人很少

from pathlib import Path # 当前文件路径 p = Path('./') # / 拼接 new_path = p / 'files' / 'data.json' print(new_path.absolute())

iterdir()遍历文件目录

比如在当前脚本的 files 目录有以下文件夹和子文件

.iterdir() 遍历某个目录下的所有路径(文件和子目录)

from pathlib import Path # 当前文件路径 p = Path('files') for i in p.iterdir(): print(i.absolute()) """运行结果: C:\Users\dell\PycharmProjects\untitled3\demo\files\json C:\Users\dell\PycharmProjects\untitled3\demo\files\username.txt C:\Users\dell\PycharmProjects\untitled3\demo\files\yaml """

如果只需获取文件夹,可以加个判断.is_dir()

from pathlib import Path # 当前文件路径 p = Path('files') print([i for i in p.iterdir() if i.is_dir()]) # [WindowsPath('files/json'), WindowsPath('files/yaml')]

也可以用.is_file获取文件对象

from pathlib import Path # 当前文件路径 p = Path('files') print([i for i in p.iterdir() if i.is_file()]) # [WindowsPath('files/username.txt')]

glob() 和 rglob() 模式匹配(正则表达式)

使用模式匹配(正则表达式)匹配指定的路径。glob 只会匹配当前目录下, rglob 会递归所有子目录 比如在当前脚本的 files 目录有以下文件夹和子文件

glob 只会匹配当前目录下

from pathlib import Path p = Path('files') # glob 只会遍历查找当前目录 print(p.glob('*.txt')) #  print([i for i in p.glob('*.txt')]) # [WindowsPath('files/username.txt')] print([i for i in p.glob('*.yml')]) # []

rglob 会递归所有子目录

from pathlib import Path p = Path('files'
                
                

-六神源码网