标准库文档:https://docs.python.org/zh-cn/3.7/library/pathlib.html

本文档相当于对官方文档进行了一些简化和总结。

pathlib模块是一款面向对象的文件系统路径模块,可以实现很多对文件路径的操作。

python文件夹和包的关系 python的lib文件夹_实例化

基础使用:

首先要区分一下Linux和Windows系统中的文件路径的不同表示方法,Linux是使用‘/’进行分割;Windows上是使用'\'分割的,这就分别对应上图的左右两部分。

pathlib库默认是实例化当前系统类型的路径,但是可以通过指定来生成任何格式的代码路径(仅限纯路径)。

#导入主类
from pathlib import Path 


#列出对应目录p的子目录
#path.iterdir() 方法用来生成子目录(而不是该目录下的文件)
#path.is_dir() 方法用来判断是否为真实路径
p = Path('.')
[x for x in p.iterdir() if x.is_dir()]


#列出对应目录p的文件
p = Path('.')
[x for x in p.iterdir()]


#列出当前目录树下的所有 Python 源代码文件
list(p.glob('**/*.py'))


#列出当前目录树下的所有文件
list(p.glob('*/*'))


#在目录树中移动
#path.resolve() 方法将一些的 路径/路径段 解析为绝对路径。
p = Path('/etc')
q = p / 'init.d' / 'reboot'


#查询路径的属性
q.exists() #判断文件路径是否存在
q.is_dir() #判断文件路径是否存在 ???【有什么区别呢?留个坑】


#打开一个文件
#path.open() 方法用来打开文件
with q.open() as f: f.readline()

纯路径(Pure Path)

纯路径对象并不针对实际路径,不会访问文件系统。有三种方式访问这些类:

  • class pathlib.PurePath(*pathsegments)
  • class pathlib.PurePosixPath(*pathsegments)
  • class pathlib.PureWindowsPath(*pathsegments)

第一种为通用类,实例化的是当前系统的路径风格,后两种通过名字可以看看出来是指定路径风格的实例化。

from pathlib import *

#纯路径的实例化
PurePath('setup.py')
PurePath('foo', 'some/path', 'bar')
PurePath(Path('foo'), Path('bar'))
PurePath() #为空时,假定为当前目录PurePosixPath('.')


#如果给出了好几个绝对路径,最后一个将视为锚
PureWindowsPath('c:/Windows', 'd:bar') #输出PureWindowsPath('d:bar')


#在 Windows 路径中,改变本地根目录并不会丢弃之前盘符的设置
PureWindowsPath('c:/Windows', '/Program Files') 
#输出PureWindowsPath('c:/Program Files'),依旧是C盘符


#假斜线和单独的点都会被消除,但是双点 (‘..’) 不会,以防改变符号链接的含义
PurePath('foo//bar') #PurePosixPath('foo/bar')
PurePath('foo/./bar') #PurePosixPath('foo/bar')
PurePath('foo/../bar') #PurePosixPath('foo/../bar')
#[发现新坑,符号链接是什么?]

通用性质

相同风格的路径可以排序与比较。

运算符

# / 可以用来创建子路径
p / 'init.d' / 'apache2'
'/usr' / q


# 路径的字符串表示法
p = PurePath('/etc')
str(p)


# 将运势文件系统路径作为字节对象输出
bytes(p)

访问个别部分

#PurePath.parts 方法可以访问路径的多个组件(类似分割)
p = PurePath('/usr/bin/python3')
p.parts #输出 ('/', 'usr', 'bin', 'python3')

方法和特征属性

#PurePath.drive 方法返回所在盘符(pure路径中含有盘符)
PureWindowsPath('c:/Program Files/').drive # 输出'c:'


#PurePath.root 表示(本地或全局)根的字符串,(即返回根路径)
PureWindowsPath('c:/Program Files/').root #输出 '\\'


#PurePath.anchor 返回盘符和根的联合
PureWindowsPath('c:/Program Files/').anchor # 输出'c:\\'


#PurePath.parents 返回父路径
p = PureWindowsPath('c:/foo/bar/setup.py')
for i in p.parents:
    print(i)
#c:\foo\bar
#c:\foo
#c:\


#PurePath.parent 返回逻辑父路径
p = PurePosixPath('/a/b/c/d')
p.parent #输出 PurePosixPath('/a/b/c')


#PurePath.name 表示路径最后组件的字符串(排除驱动器和根目录)
PurePosixPath('my/library/setup.py').name #输出 'setup.py'


#PurePath.suffix 返回最后一个组件的文件拓展名(如果存在的话)
PurePosixPath('my/library/setup.py').suffix #输出 '.py'
PurePosixPath('my/library').suffix #输出 ''
#PurePath.suffixes 返回路径的文件拓展名列表(多个拓展名的文件)


#PurePath.stem 返回最后一个路径组件(去除后缀)
PurePosixPath('my/library.tar.gz').stem #输出 'library.tar'


#PurePath.as_posix() 返回使用正斜杠的路径字符串
p = PureWindowsPath('c:\\windows')
p.as_posix() #输出 'c:/windows'


#PurePath.as_uri() 将路径表示为file:URL,如果不是绝对路径,抛出ValueError
p = PurePosixPath('/etc/passwd')
p.as_uri() #输出 'file:///etc/passwd'


#PurePath.is_absolute() 判断路径是否为绝对路径(同时包含驱动器符和根目录)
PureWindowsPath('c:/a/b').is_absolute() #输出 True


#PurePath.joinpath(*other) 用于将每个other参数中项目连接到一起
PurePosixPath('/etc').joinpath('init.d', 'apache2') 
#输出 PurePosixPath('/etc/init.d/apache2')


#PurePath.match(pattern) 判断是否和提供的通配符模式匹配(匹配从右测开始)
PurePath('a/b.py').match('*.py') #输出 True


#PurePath.relative_to(*other) 计算相对路径
p = PurePosixPath('/etc/passwd')
p.relative_to('/etc') #输出 PurePosixPath('passwd')


#PurePath.with_name(name) 返回一个新的路径并修复name(要求原路径有name)
p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') 
p.with_name('setup.py')
#输出 PureWindowsPath('c:/Downloads/setup.py')


#PurePath.with_suffix(suffix) 返回一个新的路径并修改suffix
#如果原本的路径没有后缀,新的 suffix 则被追加以代替。
#如果 suffix 是空字符串,则原本的后缀被移除:
p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
p.with_suffix('.bz2') #输出 PureWindowsPath('c:/Downloads/pathlib.tar.bz2')

具体路径

和纯路径的分类办法类似,同样有三个实例化方法:

  • class pathlib.Path(*pathsegments)
  • class pathlib.PosixPath(*pathsegments)
  • class pathlib.WindowsPath(*pathsegments)

具体路径的方法

包含纯路径方面,同时还有以下方法:

#classmethod Path.cwd() 返回一个新的,表示当前目录的路径对象
Path.cwd() #输出 PosixPath('/home/antoine/pathlib')


#classmethod Path.home() 返回一个表示当前用户家目录的新路径对象
#家目录就是用户名目录
Path.home() #输出 PosixPath('/home/antoine')


#Path.stat() 返回此路径信息
p = Path('setup.py')
p.stat().st_size


#Path.exists() 此路径是否指向一个已存在的文件或目录
Path('.').exists() #输出 True


#Path.glob(pattern) 解析相对于此路径的通配符 pattern,产生所有匹配的文件
sorted(Path('.').glob('*/*.py')) #输出 [PosixPath('docs/conf.py')]
sorted(Path('.').glob('**/*.py')) #"**" 模式表示 “此目录以及所有子目录,递归” [递归通配]


#Path.is_dir() 
#如果路径指向一个目录(或者一个指向目录的符号链接)则返回 True,
#如果指向其他类型的文件则返回 False。


#Path.is_file()
#如果路径指向一个正常的文件(或者一个指向正常文件的符号链接)则返回 True,
#如果指向其他类型的文件则返回 False。


#Path.iterdir() 当路径指向一个目录时,产生该路径下的对象的路径:
p = Path('docs')
for child in p.iterdir(): child
#输出为目录下所有的对象的路径对象


#Path.read_bytes() 以字节对象的形式返回路径指向的文件的二进制内容


#Path.read_text(encoding=None, errors=None) 以字符串形式返回路径指向的文件的解码后文本内容


#Path.rename(target) 使用给定的 target 将文件重命名


#Path.replace(target) 
#使用给定的 target 重命名文件或目录。如果 target 指向现存的文件或目录,则将被无条件覆盖。


#Path.rmdir() 移除此目录。此目录必须为空的。


#Path.samefile(other_path) 
#返回此目录是否指向与可能是字符串或者另一个路径对象的 other_path 相同的文件。
#[other_path是什么呢?]


#Path.write_bytes(data) 将文件以二进制模式打开,写入 data 并关闭


#Path.write_text(data, encoding=None, errors=None) 将文件以文本模式打开,写入 data 并关闭