面向对象的文件系统路径 -- pathlib详解

从3.4版本开始,Python提供了一个新的面向对象的处理路径的模块pathlib。其语义可以适用于不同操作系统的环境。

pathlib的思想是将路径实例化为一个对象,然后以面向对象的方式,通过属性/方法操作路径。和利用os/os.path通过操作系统直接操作路径的方法不同。

目录

一、路径对象的分类

二、纯路径(pure paths)

2.1 纯路径基础

2.2 纯路径属性及方法

三、具体路径(concrete paths)

3.1 具体路径基础

3.2 具体路径方法


一、路径对象的分类

pathlib下的路径类被分为两种:

  • 提供纯运算操作没有I/O的"纯路径"(pure paths)
  • 纯路径的子类,额外提供I/O调用功能的"具体路径"(concrete paths)

如果你不知道该用哪种路径,那么可以选择使用"具体路径"。

二、纯路径(pure paths)

2.1 纯路径基础

纯路径提供了不实际访问文件系统路径的路径处理操作。

如下场景可以使用纯路径:

  • 只需要操作路径不需要实际访问文件系统。
  • 跨平台操作路径,例如在linux上操作windows路径或在windows上操作linux路径。

有3种方式将实例化出一个纯路径对象:

  • pathlib.PurePath   通用的类,实例化一个当前系统的路径风格。
  • pathlib.PurePosixPath   PurePath的子类,实例化一个unix风格的路径对象。
  • pathlib.PureWindowsPath  PurePath的子类,实例化一个windows风格路径对象。

下面演示纯路径的相关特性:

import pathlib   # 导入主类
pathlib.PurePath('a.txt')      # 实例化
pathlib.PurePosixPath('/etc')
pathlib.PureWindowsPath('c:/program files/')

相同风格的路径可以排序与比较,且这尊重对应风格的大小写转换语义,例如在linux下路径是区分大小写的,而windows下不区分:

>>> from pathlib import PurePosixPath, PureWindowsPath
>>> PurePosixPath('vincent') == PurePosixPath('VINCENT')
>>> PureWindowsPath('vincent') == PureWindowsPath('VINCENT')

要创建新的路径对象,只需要用"/"拼接即可:

>>> p = pathlib.PurePath('/etc')
>>> q = p/'sysconfig'    # 通过路径实例p拼接出新的路径实例q
>>> q

如果某些地方(例如函数的参数)需要用到字符串形式路径,可以用 str() 转换为原始的文件系统路径字符串。 

>>> q
>>> str(q)

2.2 纯路径属性及方法

纯路径对象提供了下列方法或属性:

返回驱动器盘符的字符串(.drive):

>>> PureWindowsPath('c:/Program Files/').drive
>>> PurePosixPath('/etc').drive

 返回根目录字符串(.root):

>>> PureWindowsPath('c:/Program Files/').root
>>> PurePosixPath('/etc').root

返回驱动器和根目录的联合(.anchor):

>>> PureWindowsPath('c:/Program Files/').anchor
>>> PurePosixPath('/etc').anchor

返回路径的父路径(.parent):

>>> PurePosixPath('/a/b/c/d').parent

 

返回路径最后一个组件的字符串,通常是文件名(.name) : 

>>> PurePosixPath('my/library/setup.py').name

 

返回路径最后一个组件的扩展名(.suffix  .suffixes):

>>> PurePosixPath('my/library.tar.gz').suffix   # 返回单个扩展名
>>> PurePosixPath('my/library.tar.gz').suffixes # 返回扩展名列表

返回最后一个组件文件名:

>>> PurePosixPath('my/library.tar').stem

返回正斜杠风格(linux风格)的的路径 as_posix():

>>> p = PureWindowsPath('c:\\windows')
>>> str(p)
>>> p.as_posix()

 判断路径是否为绝对路径 is_absolute():

>>> PurePosixPath('/a/b').is_absolute()

拼接路径 joinpath():

>>> PurePosixPath('/etc').joinpath('passwd')

将路径与通用的风格匹配,如果成功则返回True:

>>> PurePath('a/b.py').match('*.py')

 返回一个新的路径并修改name。如果原本路径没有 name,则抛出ValueError :

>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> q = p.with_name('setup.py')   # 将文件名替换为setup.py
>>> p
>>> q

另外还有with_stem,with_suffix方法,用法与with_name类似,此处不再赘述。

三、具体路径(concrete paths)

3.1 具体路径基础

具体路径是纯路径的子类。除了提供纯路径的操作之外,它们还提供了对路径对象进行系统调用的方法(可以调用I/O操作具体的文件)。

有3种方式将实例化出一个具体路径对象(去掉纯路径前的Pure):

  • pathlib.Path   通用的类,实例化一个当前系统的路径风格。
  • pathlib.PosixPath   PurePath的子类,实例化一个unix风格的路径对象。
  • pathlib.WindowsPath  PurePath的子类,实例化一个windows风格路径对象。

由于存在系统调用,你只能实例化与你操作系统风格相同的路径:

>>> from pathlib import Path, PosixPath, WindowsPath
>>> Path('123.txt')
>>> PosixPath('123.txt')
>>> WindowsPath('123.txt')  # 由于系统是linux,实例化windows风格路径会报错

3.2 具体路径方法

除纯路径方法外,实体路径还提供以下方法。 如果系统调用失败(例如文件、路径不存在)这些方法中许多都会引发OSError.

Path.cwd() 返回当前目录的路径对象:

>>> Path.cwd()

Path.home() 返回用户家目录的路径对象:

>>> Path.home()

Path.exists() 判断目录或文件是否存在:

>>> Path('/home/vincent').exists()
>>> Path('/home/vincent/456.txt').exists()

Path.expanduser() 返回带有扩展 ~ 和 ~user 构造的新路径,与os.path.expanduser() 所返回的相同。 如果无法解析家目录,则会引发RuntimeError:

>>> p = PosixPath('~/123.txt')
>>> p.expanduser()    # ~被解析为当前用户的home目录,即/home/vincent

 

Path.glob(pattern) 解析相对于此路径的通配符 pattern,产生所有匹配的文件:

>>> p = Path('/home/vincent')
>>> p.glob('*.txt')        # 匹配以txt为后缀的文件
>>> list(p.glob('*.txt'))  # 目录下有1.txt, 2.txt, 3.txt 共3个文件

Path.is_dir() 判断对象是否是一个目录(或指向目录的符号链接):

>>> Path('/home/vincent').is_dir()
>>> Path('/home/vincent/1.txt').is_dir()

Path.is_file() 判断对象是否是一个文件:

>>> Path('/home/vincent').is_file()
>>> Path('/home/vincent/1.txt').is_file()

 Path.iterdir() 生成一个路径下对象的迭代器,可用for遍历并操作:

>>> p = Path('/home/vincent')
>>> for f in p.iterdir():
...     f

 Path.mkdir(mode=0o777parents=Falseexist_ok=False) 新建目录:

  • 如果给出mode,它将与当前进程的 umask 值合并来决定文件模式和访问标志。
  • 如果parents=True,所有找不到的父目录将被创建,相当与mkdir -p。
  • 如果 exist_ok 为 true, 则目录已存在的异常将被忽略。
>>> q = Path('/home/vincent/new_dir')
>>> q.mkdir()

 Path.open() 打开路径对象指向的文件:

>>> p = Path('/home/vincent/1.txt')
>>> with p.open() as f:
...     f.readline()

Path.owner() 返回文件的所有者:

>>> p.owner()

 Path.rename(target) 将文件名目录重命名为给定的target,并返回一个新的指向 target 的 Path 实例,在linux上,target指向的文件如果已存在,则会覆盖掉,在windows上会引发FileExistsError。

>>> p = Path('/home/vincent/1.txt')
>>> target = Path('/home/vincent/new_dir/abc.txt')  # 不仅重命名,还移动了目录,相当与mv
>>> p.rename(target)

 

Path.rmdir() 删除一个空目录,Path.unlink()删除文件:

>>> Path('/home/vincent/new_dir').rmdir()     # 由于目录下有文件,删除失败
>>> Path('/home/vincent/new_dir/abc.txt').unlink()  # 先删除文件
>>> Path('/home/vincent/new_dir').rmdir()   # 删除空目录成功

 以上即pathlib模块常用的方法,熟练使用面向对象的方式操作路径,会比利用os.path操作要更加简便。

下面列举的os/os.path和pathlib方法的对应情况,可以根据自己需要选择不同的处理方式:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值