总的来说,由于pathon3的标准库添加了新成员,pathlib, 它在路径调用时可以更优雅的多。而python2的文件系统中的路径处理,十分糟糕。

在pathlib中,有两个类最常用,PathPurePath,两者的区别是,后者是纯路径,不支持IO操作。简单的说,这个路径对象不支持打开和读取一个文件。所以为了偷懒,我基本上只用Path。

我喜欢这个库的原因之一,还包括跨平台的因素,比如你的路径处理可能涉及到windows和linux两个平台。在linux下,路径是/斜杠, 而window是\是反斜杠。这两者是不同的,使用pathlib完全不用考虑这个因素, joinpath()方法就可以用于路径的连接操作。

我强烈推荐先看看Python的官方文档:

https://docs.python.org/3/library/pathlib.html

一. Python2与Python3的路径处理的对比

比如这样一段代码, 把某个模块的根路径添加到python路径的list中:

import os
import sys
curpath=os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'a_diretory')
sys.path.append(curpath)

上述代码足以彰显Python2的恶劣之处了。对于上面的功能,Python3可以这么写:

import sys
from pathlib import Path
sys.path.append(Path().parent.parent.joinpath('a_diretory'))

注释: Path对象的parent属性,表示当前的路径的父目录, joinpath是路径的连接。

二. pathlib的几个使用示例

1. 最简单的使用

from pathlib import Path
p1 = Path() # 当前的模块的路径
print(p1.absolute()) # 打印当前模块的绝对路径 p2 = Path(r'C:\Users\Admin\Desktop\pythonTest') # 指定的一个路径对象--某个目录
print(p2) p3 = Path(r'C:\Users\Admin\Desktop\file.txt') # 指定的一个路径对象--某个文件
f = open(f3, encoding = 'utf-8')
print(f.read())

2. 追加路径到Python的sys.path中

# 获取当前目录的兄弟目录: A_Package_Dir
module_path = Path().parent.joinpath('A_Package_Dir').absolute()
print(module_path) # A_Package_Dir追加到python的sys.path中
sys.path.append(str(module_path)) # 然后就可以在程序中,可以随意importA_Package_Dir目录下的py文件了
import your_module_name
# do something

3. 生成目录树的技巧

这里我完全参考了下述博文,同时建议你读它: https://blog.csdn.net/triagen/article/details/74623440

from pathlib import Path
import sys def lst_tree(p, n):
if p.is_file(): #判断是否是文件
print('|' + '\t|' * n + '-' * 4 + p.name)
elif p.is_dir(): # 判断是否是目录
print('|' + '\t|' * n + '-' * 4 + str(p.relative_to(p.parent)) + '\\')
for pt in p.iterdir():
lst_tree(pt, n + 1) # 递归 if __name__ == "__main__":
# 对命令行参数进行判断
if len(sys.argv) != 1 and Path(sys.argv[1]).exists():
lst_tree(Path(sys.argv[1]), 0)
else:
lst_tree(Path('.'), 0)

4. 递归删除一个目录

from pathlib import Path

 # 递归删除dir_abs_path目录下的子文件和子文件夹
def delete_dir_recursively(dir_abs_path):
p = Path(dir_abs_path)
for item in p.iterdir():
if item.is_file():
# print('正在删除文件: {}'.format(item))
item.unlink()
continue
if item.iterdir():
abs_path = p.joinpath(item.name)
delete_dir_recursively(abs_path)
# print('正在删除目录: {}'.format(item))
item.rmdir() # Pathon学习: 从入门到删库跑路,哈哈!
t = r'E:\project\公司的库'
delete_dir_recursively(t)

注意,我这里用了unlink()方法,它只能用于删除文件(不能是一个目录)。rmdir()方法,它只能用于删除一个空目录(没有子目录和子文件)。再强调一遍,切记,rmdir()当且仅当这个目录为空时,它才能执行,否则抛出异常。

这也是我为什么要用递归的原因,因为如此才能确保从最里面的一个文件夹开始删除,这样rmdir()目录的内部向外部,逐层递归执行,才不会出错。

三. 写在最后

pathlib几乎可以处理与路径有关的操作的一切,包括glob()方法--路径中使用通配符进行匹配,joinpath()路径的连接,stat()--文件或目录的属性,创建时间,大小,等等。pathlib它太强大了。

到此,你完全可以抛弃Python2中什么os.xxx了

pathlib的使用的更多相关文章

  1. 【python】利用pathlib遍历目录Path().rglob

    来源:https://docs.python.org/3/library/pathlib.html 可以用pathlib模块中的Path().rglob来递归遍历文件 from pathlib imp ...

  2. 【python】pathlib库

    pathlib在python3.2以上开始默认支持,在python2.7中如果要使用需要安装 pip install pathlib pathlib更多参考资料:http://pathlib.read ...

  3. Python中pathlib模块

    Python中pathlib模块 Path.cwd():返回当前目录的路径 Path.home():返回当前用户的家目录 Path.stat():返回此路径信息 Path.touch():创建文件 P ...

  4. py库:os、shutil、pathlib

    https://www.cnblogs.com/MnCu8261/p/5494807.html shutil模块 http://blog.csdn.net/rozol/article/details/ ...

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

    原文连接   https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...

  6. 【转】Python 3的pathlib模块:驯服文件系统

    [转]Python 3的pathlib模块:驯服文件系统 https://python.freelycode.com/contribution/detail/1248 Python部落(python. ...

  7. (转)pathlib路径库使用详解

    原文:https://xin053.github.io/2016/07/03/pathlib%E8%B7%AF%E5%BE%84%E5%BA%93%E4%BD%BF%E7%94%A8%E8%AF%A6 ...

  8. pathlib

    导入Path类 from pathlib import Path 创建Path对象 p = Path('C:\Windows\System32') # 用C:\Windows\System32创建Pa ...

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

    #!/usr/bin/env python # coding=utf-8 __author__ = 'Luzhuo' __date__ = '2017/5/7' import os def os_de ...

  10. [PY3]——IO——pathlib

    pathlib.Path() from pathlib import Path p=Path("/test2") Path.cwd() print(p.cwd()) /py3 Pa ...

随机推荐

  1. hyper-v显示分辨率如何自动调整

    打开文件/etc/default/grub 找到GRUB_CMDLINE_LINUX_DEFAULT所在行,在最后加上 video=hyperv_fb:[分辨率],比如我想要的分辨率是1600×900 ...

  2. Netty 4 实现一个 NettyClient

    本文章为作者原创,有问题的地方请提出指正. 1.类继承Diagram 2.定义EndPoint类 目前仅仅定义了2个方法,分别用来获取本地或远程服务器的地址. package netty; impor ...

  3. 运维笔记--Linux查找指定目录下包含某字符串的文件

    待整理: 参考:http://blog.sina.com.cn/s/blog_53d496960102xg5c.html 例: find /home/logstash/ -type f | xargs ...

  4. Nginx实践篇(5)- Nginx代理服务 - 代理缓冲区、代理重新定义请求头、代理连接超时(转)

    Nginx实践篇(5)- Nginx代理服务 - 代理缓冲区.代理重新定义请求头.代理连接超时 nginx参数默认值 http://nginx.org/en/docs/http/ngx_http_co ...

  5. kubernetes篇 容器用户权限控制

    问题起源 问题起源于一个开发BUG:正常运行一段时间的POD,突然有一天运行报错了,错误是没有操作目录的权限,查其原因,原来是镜像被更新了,镜像添加了操作用户,而被操作的目录(NFS目录)并不具备普通 ...

  6. [转]TrueType(TTF)字体文件裁剪(支持简体中文,繁体中文TTF字体裁剪)

    原文入口: TTF字体文件裁剪(支持简体中文,繁体中文TTF字体裁剪) 对于TrueType(TTF)字体格式的介绍可以看: https://www.cnblogs.com/slysky/p/1131 ...

  7. resources-plugin-2.6.pom.part.lock (没有那个文件或目录)

    由于 自定义 maven 仓库没权限 /home/repository 自定义目录 [root@localhost Service]# cat /etc/group|grep jenkins jenk ...

  8. VMware设置桥接模式(使虚拟机拥有独立IP访问外网)

    1.关闭虚拟机里的系统 2.VMware主窗口 编辑---->虚拟网络编辑器 右下角----> 更改设置---->出现  桥接模式 桥接到:看本机所连接的网络, 网络属性中有一项“描 ...

  9. OpenShift 4.1 演示

    功能演示主要包含三个方面. 1. 管理控制台 push镜像发布应用 podman build -t mytomcat:slim . podman tag localhost/mytomcat:slim ...

  10. {Redis}NOAUTH Authentication required. Linux.cenOS

    问题 [root@VM_0_12_centos redis]# ./bin/redis-cli -p 6379 127.0.0.1:6379> INFO NOAUTH Authenticatio ...