总的来说,由于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了

最新文章

  1. Devexpress EXCEL导出
  2. Java绘图
  3. BZOJ 1036:树的统计Count(树链剖分)
  4. 自定义View(4)Canvas和Paint常用绘制函数
  5. Centos6快速yum lamp
  6. iOS-UIResponse之事件响应链及其事件传递
  7. nosql学习一
  8. 恢复js文件在windows默认打开方式
  9. poj 1687 Buggy Sat 简单计算几何
  10. Gulp实现css、js、图片的压缩以及css、js文件的MD5命名
  11. Azure Messaging-ServiceBus Messaging消息队列技术系列7-消息事务
  12. Git 工作流的正确打开方式
  13. EasyUI的textbox的disable ,readonly 用法
  14. ubuntu18.04安装redis
  15. app测试自动化之定位元素
  16. libcurl断点下载遇到的问题
  17. PNG怎么转换成32位的BMP保持透明
  18. linux,windows 可执行文件(ELF、PE)
  19. css控制英文内容自动换行問題
  20. 【BZOJ4198】【NOI2015】荷马史诗(贪心,Huffman树)

热门文章

  1. 站在BERT肩膀上的NLP新秀们(PART I)
  2. ssh scp 上传下载文件
  3. centos 7 U盘 uefi 模式装机
  4. Python向excel中写入数据的方法 方法简单
  5. Could not create connection to database server. Attempted reconnect 3 times. Giving up.
  6. 使用 atom 将 makedown 编辑并转换成 pdf
  7. PV、TPS、QPS是怎么计算出来的?(转载的)
  8. C# 动态执行JS
  9. GPL & LGPL
  10. 锐捷交换机如何配置远程管理地址(telnet)