在 python 当中,如果你想控制路径,基本上绕不开 os.path。我希望看完这篇文章以后,熟练使用 python 的你能立刻开始使用 pathlib 模块,一刻也不要耽误。

pathlib 相对于 os.path 有以下优势:

  • pathlib 导入更加清晰;
  • 采用面向对象编程,能同时存储更多状态,os.path 返回的通常只有一个字符串;
  • pathlib 使用更简单

获取路径相关信息

pathlib 会把路径相关信息都存在一个 Path 的核心类里面,比如用户名,后缀名,上层目录,文件创建时间,文件大小等等。 这些 os.path 是没有办法一次性都给我们的,因为 os.path 调用的函数几乎都是返回字符串格式,不能像 Path 对象这样保存状态。

1, 获取当前文件路径。这种操作方式可能会包含相对路径信息。

# 获取当前路径
current_path = Path(__file__)
print(current_path)

2,当前文件夹路径。

current_path = Path('.')
print(current_path)

3, 获取当前文件和文件夹的元信息。

st = current_path.stat()
print(st)
# 文件大小
print(st.st_size)
# 文件时间
print(st.st_atime)

4,Path(‘.’) 这种方式可以包含相对路径 ../doc 等,如果要获取绝对路径要使用 resolve 获取绝对路径。

current_path.resolve()

如果路径不存在, 是不会抛出异常的。如果想抛出异常,可以设置参数 strict 设为 True,抛出 FileNotFoundError。

current_path.resolve(strict=True)

5, 获取父目录。这是 os.path 最被人诟病的一点,你需要不停的通过 os.path.dirname() 去获取父目录,层级多了,心都碎了。 在 pathlib 里,因为采用的是对象形式,可以直接通过 parent 属性获取父目录,父目录同时也是一个 Path 对象,照样可以用 parent 去获取目录。

parent = current_path.parent.parent.parent

6, 如果需要不停的返回上一级目录,不停的 parent 属性也会让人不厌其烦。pathlib 提供了一种更灵活的机制让你去获取高层父目录, 就是 parents 属性。 parents 会把从根目录开始的所有层级都保存起来,直接通过索引获取对应层级就可以了。

parents = current_path.parent

first_p = parents[0]

second_p = parents[1]

这里有一点非常遗憾,pathlib 没有支持逆向索引,也就是说不能通过 parents[-2] 去达到和 current_path.parent.parent 相同的效果。在实际应用中,这种场景用得还是挺多的,需要通过某个文件获取上层路径,上上层路径。

# TODO: 可以封装的技能,目前未实现
parents[-3]

提供一种封装思路:

def my_parents(self, nagtive_num):
....
return self.parents[len(current_path.parents) + nagtive_num]

还有一种思路,重写源码中的 __getitem__ 方法,这里不做深入阐述。

7, 获取文件名称

name = current_path.name

8, 获取文件后缀名。

file_suffix = current_path.suffix

9,获取不含后缀名的文件名。

file_without_suffix = current_path.stem

路径操作

1,with_name, 改变文件名, 生成新路径,实际文件不发生变化.

# 改变文件名为 new_name.py,生成新路径,实际文件不发生变化
# 原来的文件名封装在 current_path 对象中
with_name = current_path.with_name('new_name.py')

2, with_suffix, 改变后缀名。

# 改变后缀名,生成新路径,实际文件不发生变化
with_suffix = current_path.with_suffix('.new_suffix')

3, 路径拼接。 pathlib 提供了和 os.path.join() 类似的路径拼接方式:

new_path = current_path.joinpath('join_path')

更重要的是,他提供了一种更直观的方式 /

new_path = current_path / 'lemon/yuze' / 'yuze_again'

这种方式的实现原理学过测试开发课程的同学应该很容易想到,定义一个除法运算的魔术方法就可以。

思考:pathlib 可以完全代替 os.path 吗?

python 路径操作工具 pathlib,比 os 模块好用太多的更多相关文章

  1. python 中文件输入输出及os模块对文件系统的操作

    整理了一下python 中文件的输入输出及主要介绍一些os模块中对文件系统的操作. 文件输入输出 1.内建函数open(file_name,文件打开模式,通用换行符支持),打开文件返回文件对象. 2. ...

  2. Python(七)之OS模块

    文件系统功能:os模块 python编程时,经常和文件.目录打交道,这是就离不了os模块.os模块包含普遍的操作系统功能,与具体的平台无关.以下列举常用的命令: 目录: os.mkdir('/tmp/ ...

  3. Python之文件操作:os模块

    Python os 模块提供了一个统一的操作系统接口函数 一.对于系统的操作 1.os.name 当前使用平台 其中 ‘nt’ 是 windows,’posix’ 是linux 或者 unix 2.o ...

  4. Python基础之time、os模块

    1.时间模块 1)模块 python安装好之后,会有一些默认模块,我们称之为标准库,标准库中的模块python自带,无需安装. 除了标准库,还有一个第三方库,可以通过pip来安装,不同的库有不同的功能 ...

  5. Python学习总结13:os模块

    os模块包含普遍的操作系统功能,与具体的平台无关.常用于处理文件和目录这些我们日常手动需要做的操作. 1. os模块函数汇总 1) os.name():判断现在正在实用的平台,Windows 返回 ‘ ...

  6. python全栈开发之OS模块的总结

    OS模块 1. os.name()      获取当前的系统 2.os.getcwd      #获取当前的工作目录 import os cwd=os.getcwd() # dir=os.listdi ...

  7. Python连载9-setup环境变量&os模块

    一.timeit包(上接连载9) 1.我们对于timeit函数,可采取如下例子: h = ''' def doTt(num1): for i in range(num1): print(i) ''' ...

  8. Python+Selenium学习笔记7 - os模块

    os模块是关于文件/目录方面的 导入语法 import os 相关方法 path.abspath()   用来获取当前路径下的文件 os.path.abspath('checkbox.html')  ...

  9. python中获取当前路径【os模块】

    本机windows,文件目录F:\python\ClStudyDemo\osTest.py os.path.realpath(_file_)——返回真实路径 os.path.split()——返回路径 ...

随机推荐

  1. xwiki使用中的问题

    xwiki 内存限制 问题重现: xwiki启动后内存.cpu一直上涨,不回落,启动后服务访问速度越来越慢,最后无法访问 分析: xwiki在启动时会消耗大量内存和cpu,增加tomcat最大内存限制 ...

  2. [CSP-S模拟测试]:打表(猜测题意+结论)

    题目传送门(内部题139) 输入格式 第一行两个整数$k,ans$,表示内存地址$A$的位数,以及答案所在的内存地址. 接下来一行$2^k$个整数,分别表示内存地址$0...2^k-1$上的值. 输出 ...

  3. JSP中解决session超时跳转到登陆页面并跳出iframe框架或局部区域的方法

    当session会话超时,页面请求被重新定位到了登陆界面.但登录界面在iframe中的解决方案:在登录页面中加入下面的js代码: <script type="text/javascri ...

  4. MqttConnectReturnCode枚举值

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  5. 五一 DAY 3

    DAY 3      2019.4.30 动态规划DP Dp是一个很抽象的东西 方法没有明显区别,很难总结套路 啥是DP? DP等价于DAG!!! (1)无后效性:DP的所有状态之间组成一个DAG ( ...

  6. android 面试汇总<一>

    1.1 Android Activity Q:说下Activity的生命周期? 技术点:Activity生命周期 思路:分条解释Activity从创建到销毁整个生命周期中涉及到的方法及作用 参考回答: ...

  7. [Flask]通过render_form快捷渲染表单

    依赖: Bootstrap-Flask 实例化方式与flask_bootstrap相同. 关于render_form(): Bootstrap-Flask内置了两个用于渲染WTForms表单类的宏,r ...

  8. Jmeter(九)集合点

    性能测试需要模拟大量用户并发,集合点能够尽量让虚拟用户同一时刻发送请求, 在Jmeter中集合点是通过定时器-同步定时器来完成的.

  9. Jmeter(七)参数化

    初识Jmeter的时候, 除了感觉安装和配置都很轻量以外, 还有一个最大的感触就是, 翻译真硬啊, 真的够够的! 和他磨合了挺长一段时间之后, 终于开悟了, 这些硬硬的翻译, 其实还是基本靠谱的, 看 ...

  10. Java List集合 遍历 四种方式(包含 Lambda 表达式遍历)

    示例代码如下: package com.miracle.luna.lambda; import java.util.ArrayList; import java.util.List; /** * @A ...