路径拼接技巧以及pathlib2插件

568 阅读4分钟

一.前言介绍

在项目中,我们经常会碰到要对文件或者是路径进行操作的需求,比如日志目录、测试报告目录、数据驱动目录以及提供一些路径操作的公共方法等, 在文件的路径拼接中,经常会将两个路径相拼接后得到一个新路径从而满足我们不同的需要。

不过因为Windows系统中路径符号用【反斜杠】表示:\

比如表示一个文件的路径为: C:\Users\Administrator\Desktop\test.xlsx

而在mac或者linux系统中路径符号用【正斜杠】表示:/

比如表示一个文件的路径为: /Users/home/Documents/test.xlsx

这就会导致一个问题,在使用路径拼接时,当字符串路径中含有斜杠或者是反斜杠时,虽然在当前的操作系统中运行是正常的,但是不能保证在其他操作系统中可以正常运行,比如在项目的框架搭建初时就需要考虑在文件的路径操作上尽量避免使用斜杠或者反斜杠,不然可能需要针对不同的操作系统进行适配

在我们最初接触文件操作的时候,掌握的第一个库是os库,里面有os.path.join()方法,可以利用它来在路径操作时,避免斜杠或反斜杠的直接使用,从而将一些路径或文件进行拼接,但是多层级路径操作时,需要多个join()方法来多次拼接,这样使用时易出错且不美观,可读性也不高

二.pathlib2插件介绍

那么这个问题需要解决,可以引入pathlib2这个插件 安装方式和文档见官网:

https://pypi.org/project/pathlib2/

下面介绍下这个库中对路径的常用操作: 安装好库后,可以导入模块

from pathlib2 import Path

路径的获取操作(常用):

print(Path.cwd())                   # 获取当前文件的目录(绝对路径)
print(Path.home())                  # 获取家目录(绝对路径)
print(Path.cwd().parent)            # 获取当前目录的父目录(绝对路径)
print(Path.cwd().parent.parent)     # 获取当前目录的父目录的父目录(绝对路径)

路径拼接:

  • 直接拼接需要的文件或路径(使用层级符号:/ )

注意!这里面的 / 符号,并不是传统意义上字符串路径上的【斜杠】或者【反斜杠】,它代表的是一个层级

比如当前目录父目录下面有一个test.xlsx的文件,我们用层级符号来获取

file = Path.cwd().parent / 'test.xlsx'   # 获取当前目录的父目录下test.xlsx文件

同样的,比如父目录下面还有2个文件夹:P1和P2,其中P1下面有文件a.txt, P2下面有b.txt

那么我们如何在当前目录来表示a.txt,和b.txt的路径呢?

file = Path.cwd().parent / 'P1' / 'a.txt'   # 获取当前目录父目录下P1文件夹下a.txt文件
file = Path.cwd().parent / 'P2' / 'b.txt'   # 获取当前目录父目录下P2文件夹下b.txt文件

看到没,使用层级符号 / 可以很容易表目录层级逻辑,也符合我们的生活习惯,从此再复杂的路径我们都可以用它来表示,无需用很多join()来重复拼接,我们只需要将路径拆分为一个个小单元,然后用层级符号来进行定位即可

  • 层级符号也可以配合变量使用

配合变量使用这样会让它更强大,比如我们再创建日志目录时,需要每天产生不同的日期来进行存储日志

例:

import datetime
from pathlib2 import Path

nowdate = datetime.datetime.now().strftime('%Y年%m月%d日%H时%M分%S秒')
reportFile = Path.cwd().parent / nowdate

其中的nowdate为时间变量,这样我们在当前目录父母下面按照时间去创建了一个时间文件,用来存储日志相关

使用了层级符号后,便告别了传统字符串路径中的斜杠或者反斜杠,且表达更人性化,易读

文件的一些其他操作(常用):

file = Path.cwd().parent / 'test.xlsx'   # 获取当前目录的父目录下test.xlsx文件

print(file.name)                       # 获取文件名
print(file.suffix)                     # 获取文件扩展名
print(file.stem)                       # 获取扩展名前缀
print(file.with_name('aaa.py'))        # 用aaa.py替换原文件名称,并生成绝对路径
print(file.with_suffix('.txt'))        # 用.txt替换原扩展名.py,并生成绝对路径

当然这是pathlib2中比较常见路径相关的操作,还有一些其他的操作,详细可见官方文档,欢迎讨论和交流