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

目录
  • 前言
  • pathlib 库
  • pathlib 获取文件路径
    • Path.cwd 获取当前文件夹路径
    • 获取当前文件路径
    • 获取 Path 对象绝对路径
    • 一些常用的获取文件属性
    • 获取上层,上上层目录
    • 获取用户home目录
  • 判断文件,文件夹
    • is_file()判断是不是文件
    • is_dir() 判断是否是文件夹
    • exists() 判断文件 或文件夹是否存在
    • is_absolute() 判断是否是绝对路径
  • joinpath 拼接目录
  • iterdir()遍历文件目录
  • glob() 和 rglob() 模式匹配(正则表达式)
    • glob 只会匹配当前目录下
    • rglob 会递归所有子目录
    • match() 检查路径是否符合规则
  • 创建文件操作
    • touch() 创建文件
    • mkdir() 创建目录
    • 递归创建目录mkdir(parents=True)
  • 删除文件操作
    • rmdir() 一次只删除一级目录,且当前目录必须为空。
    • unlink() 删除文件
  • 文件读写操作
  • 修改文件
    • replace() 移动文件
    • with_name() 重命名文件
  • 总结

前言

如果你还在为操作文件路径烦恼,不会使用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.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 and 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

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()))  # <class 'pathlib.WindowsPath'>

获取当前文件路径

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)  # 所有的父级 <WindowsPath.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'))  # <generator object Path.glob at 0x000001A44565A518>
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')
# glob 只会遍历查找当前目录
print(p.rglob('*.txt'))  # <generator object Path.glob at 0x000001A44565A518>
print([i for i in p.rglob('*.txt')])  # [WindowsPath('files/username.txt')]
print([i for i in p.rglob('*.yml')])  # [WindowsPath('files/yaml/aa.yml'), WindowsPath('files/yaml/bb.yml')]

match() 检查路径是否符合规则

from pathlib import Path

p = Path('data.json')
# math 检查匹配规则
print(p.match('*.json'))  # True

创建文件操作

touch() 创建文件

from pathlib import Path

p = Path('xx.json')
p.touch()   # 创建一个xx.json

当文件已经存在的时候,p.touch() 也不会报错,因为默认参数 exist_ok=True 如果设置 exist_ok=False, 文件已经存在,touch就会报错了

from pathlib import Path

p = Path('xx.json')
p.touch(exist_ok=False)   # 创建一个xx.json

抛出异常FileExistsError: [Errno 17] File exists: 'xx.json'

mkdir() 创建目录

在当前脚本下创建一个yoyo目录

from pathlib import Path

p = Path('yoyo')
# mkdir 创建yoyo目录
p.mkdir()

如果想一次性创建多层目录 'yoyo/json'

from pathlib import Path

p = Path('yoyo/json')
# mkdir 创建yoyo/json目录
p.mkdir()

此时会抛出异常FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'yoyo\json'

递归创建目录mkdir(parents=True)

from pathlib import Path

p = Path('yoyo/json')
# mkdir 创建yoyo/json目录
p.mkdir(parents=True)

删除文件操作

删除目录非常危险,并且没有提示,一定要谨慎操作

rmdir() 一次只删除一级目录,且当前目录必须为空。

from pathlib import Path

p = Path('yoyo/json')
# mkdir 创建yoyo/json目录
p.rmdir()

unlink() 删除文件

from pathlib import Path

p = Path('files/username.txt')
p.unlink()

文件读写操作

pathlib 对读取和写入进行了简单的封装,不再需要重复去打开文件和管理文件的关闭了。

  • .read_text() 读取文本
  • .read_bytes() 读取 bytes
  • .write_text() 写入文本
  • .write_bytes() 写入 tytes
from pathlib import Path

p = Path('yo.txt')
p.write_text("hello world")
print(p.read_text())  # hello world

file.write 操作使用的是 w 模式,如果之前已经有文件内容,将会被覆盖。

修改文件

replace() 移动文件

from pathlib import Path

p = Path('yo.txt')
p.write_text("hello world")
print(p.read_text())  # hello world

p.replace('xx.json')

with_name() 重命名文件

from pathlib import Path

p = Path('hello.txt')
p.write_text("hello world")
print(p.read_text())  # hello world

# 重命名为一个新的文件对象
new_file = p.with_name('x.txt')
print(new_file)
p.replace(new_file)  # 移动到新的位置

总结

到此这篇关于python3利用pathlib替代os.path的文章就介绍到这了,更多相关python3 pathlib替代os.path内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详谈Python3 操作系统与路径 模块(os / os.path / pathlib)

    以下代码以Python3.6.1 / windows10为例 Less is more! #!/usr/bin/env python # coding=utf-8 __author__ = 'Luzhuo' __date__ = '2017/5/7' import os def os_demo(): # 执行命令 dirs = os.popen("dir").read() print(dirs) # 打印目录树 dirs_info = os.scandir() for info in

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

    目录 前言 pathlib 库 pathlib 获取文件路径 Path.cwd 获取当前文件夹路径 获取当前文件路径 获取 Path 对象绝对路径 一些常用的获取文件属性 获取上层,上上层目录 获取用户home目录 判断文件,文件夹 is_file()判断是不是文件 is_dir() 判断是否是文件夹 exists() 判断文件 或文件夹是否存在 is_absolute() 判断是否是绝对路径 joinpath 拼接目录 iterdir()遍历文件目录 glob() 和 rglob() 模式匹配

  • Python3利用openpyxl读写Excel文件的方法实例

    前言 Python中常用的操作Excel的三方包有xlrd,xlwt和openpyxl等,xlrd支持读取.xls和.xlsx格式的Excel文件,只支持读取,不支持写入.xlwt只支持写入.xls格式的文件,不支持读取. openpyxl不支持.xls格式,但是支持.xlsx格式的读取写入,并且支持写入公式等. 原始数据文件apis.xlsx内容: name method url data json result get接口 get https://httpbin.org/get?a=1&b=

  • 对python3中pathlib库的Path类的使用详解

    用了很久的os.path,今天发现竟然还有这么好用的库,记录下来以便使用. 1.调用库 from pathlib import 2.创建Path对象 p = Path('D:/python/1.py') print(p) #可以这么使用,相当于os.path.join() p1 = Path('D:/python') p2 = p1/'123' print(p2) 结果 D:\python\1.py D:\python\123 3.Path.cwd() 获取当前路径 path = Path.cw

  • 如何使用python3获取当前路径及os.path.dirname的使用

    这篇文章主要介绍了如何使用python3获取当前路径及os.path.dirname的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 方法一: import sys,os os.getcwd()#然后就可以看见结果了 方法二: import os os.path.dirname(os.path.realpath('__file__'))#注意:添加单引号 python中的os.path.dirname(__file__)的使用 (1)当"p

  • Python3 利用face_recognition实现人脸识别的方法

    前言 之前实践了下face++在线人脸识别版本,这回做一下离线版本.github 上面有关于face_recognition的相关资料,本人只是做个搬运工,对其中的一些内容进行搬运,对其中一些例子进行实现. 官方描述: face_recognition是一个强大.简单.易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特别是兼容树莓派系统.本项目是世界上最简洁的人脸识别库,你可以使用Python和命令行工具提取.识别.操作人脸.本项目的人脸识别是基于业内领先的C++开源库 dlib中

  • python os.path模块常用方法实例详解

    os.path模块主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法.更多的方法可以去查看官方文档:http://docs.python.org/library/os.path.html 1.os.path.abspath(path) 返回path规范化的绝对路径. >>> os.path.abspath('test.csv') 'C:\\Python25\\test.csv' >>> os.path.abspath('c:\\test.csv') '

  • python中os.path.join()函数实例用法

    1.说明 拼接文件路径,可以有多个参数. 2.语法 os.path.join(path1,path2,*) path1 初始路径. path2 需要拼接在其后的路径.初始路径文件夹下的文件或文件夹.可以有多个需要拼接的参数,依次拼接. 3.注意 如果拼接在后的参数中含有'\'开头的参数,将从'\'开头的参数开始,前面的参数均将失效,并且路径将从对应磁盘的根目录开始. 4.实例 >>> import os >>> path='D:\dataset' >>>

  • python中join与os.path.join()函数实例详解

    目录 一.join函数 (一)参数使用说明 (二)实例说明 二.os.path.join() (一)参数使用 (二)实例说明 总结 一.join函数 (一)参数使用说明 描述 Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. 语法 join()方法语法: str.join(sequence) 参数 sequence -- 要连接的元素序列. 返回值 返回通过指定字符连接序列中元素后生成的新字符串. (二)实例说明 1.对序列进行操作 x = ['qingni

  • python3利用smtplib通过qq邮箱发送邮件方法示例

    前言 本文主要给大家介绍了关于python3 smtplib通过qq邮箱发送邮件的相关内容, smtplib模块是smtp简单邮件传输协议客户端的实现,为了通用性,有时候发送邮件的时候要带附件或图片,用email.mime来装载内容. 详细代码参考说明:Python3 SMTP发送邮件 0.了解qq邮箱的SMTP QQ邮箱 POP3 和 SMTP 服务器地址设置如下: 邮箱 POP3服务器(端口995) SMTP服务器(端口465或587) qq.com pop.qq.com smtp.qq.c

  • Java利用反射实现框架类的方法实例

    框架类的简单实现 实现步骤: 1. 加载配置文件 2. 获取配置文件中定义的数据 3. 加载该类进内存 主要讲解第一步:加载配置文件 的相关知识. //1.加载配置文件 //1.1创建Properties对象 Properties pro = new Properties(); //1.2加载配置文件,转换为一个集合 //1.2.1获取class目录下的配置文件 ClassLoader classLoader = ReflectTest.class.getClassLoader(); Input

随机推荐