python 标准库 pathlib

原文链接:https://www.jianshu.com/u/8f2987e2f9fb

纯路径
纯路径对象提供了不实际访问文件系统的路径处理操作。
有三种方式来访问这些类,也是不同的风格:
class pathlib.PurePath(*pathsegments):一个通用的类,代表当前系统的路径风格(实例化为 PurePosixPath 或者 PureWindowsPath):

p = pathlib.PurePath('1.txt')
print(type(p))      # 输出<class 'pathlib.PureWindowsPath'>

每一个 pathsegments 的元素可能是一个代表路径片段的字符串,一个返回字符串的实现了 os.PathLike 接口的对象,或者另一个路径对象:

p = pathlib.PurePath('c:\\','1.txt')
print(p)      # 输出c:\1.txt

当 pathsegments 为空的时候,假定为当前目录:

p = pathlib.PurePath()
print(p)      # 输出.

当给出一些绝对路径,最后一位将被当作锚(模仿 os.path.join() 的行为):

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
p = pathlib.PurePath('\\1','\\2.txt')
print(p)      # 输出\2.txt

p = pathlib.PurePath('c:\\1','d:\\2.txt')
print(p)      # 输出d:\2.txt

但是,在 Windows 路径中,改变本地根目录并不会丢弃之前盘符的设置:

p = pathlib.PurePath('c:\\1','\\2.txt')
print(p)      # 输出c:\2.txt

假斜线和单独的点都会被消除,但是双点 (‘…’) 不会,以防改变符号链接的含义:

p = pathlib.PurePath('c:\\.\\..\\1.txt')
print(p)      # 输出c:\..\1.txt

class pathlib.PurePosixPath(*pathsegments)一个 PurePath 的子类,路径风格不同于 Windows 文件系统:

p = pathlib.PurePosixPath('/1/1.txt')
print(p)

class pathlib.PureWindowsPath(*pathsegments):PurePath 的一个子类,路径风格为 Windows 文件系统路径:

p = pathlib.PureWindowsPath('\\1\\1.txt')
print(p)

路径是不可变并可哈希的。相同风格的路径可以排序与比较。这些性质尊重对应风格的大小写转换语义:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
print(PurePosixPath('A') == PurePosixPath('a'))         # False
print(PureWindowsPath('A') == PureWindowsPath('a'))     # True
print(PureWindowsPath('1') in {PureWindowsPath('1')})   # True
print(PurePosixPath('A') < PurePosixPath('B'))          # True

不同风格的路径比较得到不等的结果并且无法被排序:
print(PureWindowsPath(‘A’) == PurePosixPath(‘A’)) # False
print(PurePosixPath(‘A’) < PureWindowsPath(‘B’))
‘’’
报错
TypeError: ‘<’ not supported between instances of ‘PurePosixPath’ and ‘PureWindowsPath’
‘’’
斜杠 / 操作符有助于创建子路径,就像 os.path.join() 一样:

p = PurePath()
print(p / 'c://' / '1.txt')     # 输出c:\1.txt

文件对象可用于任何接受 os.PathLike 接口实现的地方。

from pathlib import *
import os
p = PurePath()
print(os.fspath(p)) #.

路径的字符串表示法为它自己原始的文件系统路径(以原生形式,例如在 Windows 下使用反斜杠)。你可以传递给任何需要字符串形式路径的函数。

print(PurePath('c://1.txt'))    # c:\1.txt

类似地,在路径上调用 bytes 将原始文件系统路径作为字节对象给出,就像被 os.fsencode() 编码一样,只推荐在 Unix 下调用 bytes。在 Windows, unicode 形式是文件系统路径的规范表示法。
访问个别部分

PurePath.parts:一个元组,可以访问路径的多个组件:

print(PurePath('c://1.txt').parts)    # ('c:\\', '1.txt')

PurePath.drive:一个表示驱动器盘符或命名的字符串,如果存在:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
print(PureWindowsPath('C://1.txt').drive)   # C:
print(PureWindowsPath('1.txt').drive)       # ''
print(PurePosixPath('/home').drive)         # ''

UNC 分享也被认作驱动器:

print(PureWindowsPath('//host/1/1.txt').drive)   # \\host\1

PurePath.root:一个表示(本地或全局)根的字符串,如果存在:

print(PureWindowsPath('C://1//').root)      #\
print(PureWindowsPath('c:1/1/').root)       #''
print(PurePosixPath('/etc').root)           #/

UNC 分享一样拥有根:

print(PureWindowsPath('//host/1').root)      #\

驱动器和根的联合:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
print(PureWindowsPath('c://1//').anchor)    # c:\
print(PureWindowsPath('c:1//').anchor)      # c:
print(PurePosixPath('/home').anchor)        # /
print(PureWindowsPath('//host/1').anchor)   # \\host\1\

PurePath.parents:提供对路径逻辑祖先的访问的不可变序列:

parents = PureWindowsPath('c://1/2/3').parents
for parent in parents:
    print(parent)
'''
输出:
c:\1\2
c:\1
c:\
'''

PurePath.parent:此路径的逻辑父路径:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
print(PureWindowsPath('c://1/2/3').parent)  #c:\1\2
print(PurePosixPath('/').parent)    # /
print(PurePosixPath('..').parent)   # .
print(PurePosixPath('.').parent)    # .
print(PureWindowsPath('c://').parent)   # c:/

PurePath.name:一个表示最后路径组件的字符串,排除了驱动器与根目录,如果存在的话:

print(PurePosixPath('/home/1.txt').name)    # 1.txt
print(PureWindowsPath('c://1.txt').name)    # 1.txt

UNC 驱动器名不被考虑:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
print(PureWindowsPath('//host/1').name)         # ''
print(PureWindowsPath('//host/1/1.txt').name)   # 1.txt

PurePath.suffix:最后一个组件的文件扩展名,如果存在:

print(PureWindowsPath('1.txt').suffix)      # .txt
print(PureWindowsPath('1/').suffix)         # ''
print(PurePosixPath('1.tar.gz').suffix)     # .gz

PurePath.suffixes:路径的文件扩展名列表:

print(PureWindowsPath('1.txt').suffixes)    # ['.txt', '.xx']
print(PureWindowsPath('1//').suffixes)      # []
print(PurePosixPath('1.tar.gz').suffixes)   # ['.tar', '.gz']

PurePath.stem:最后一个路径组件,除去后缀:

print(PureWindowsPath('1.txt').stem)    # 1
print(PureWindowsPath('1//').stem)      # 1
print(PurePosixPath('1.tar.gz').stem)   # 1.tar

PurePath.as_posix():返回使用正斜杠(/)的路径字符串:

print(PureWindowsPath('c:\\1.txt').as_posix())    # c:/1.txt

PurePath.as_uri():将路径表示为 file URL。如果并非绝对路径,抛出 ValueError。

print(PureWindowsPath('c:\\1.txt').as_uri())
'''
输出:
file:///c:/1.txt
'''

PurePath.is_absolute():返回此路径是否为绝对路径。如果路径同时拥有驱动器符与根路径(如果风格允许)则将被认作绝对路径。

print(PurePosixPath('/a/b').is_absolute())          # True
print(PurePosixPath('a/b').is_absolute())           # False
print(PureWindowsPath('c://a/b').is_absolute())     # True
print(PureWindowsPath('/a/b').is_absolute())        # False
print(PureWindowsPath('//host/1').is_absolute())    # True

PurePath.is_reserved():在 PureWindowsPath,如果路径是被 Windows 保留的则返回 True,否则 False。在 PurePosixPath,总是返回 False。

print(PureWindowsPath('nul').is_reserved())     # True
print(PurePosixPath('nul').is_reserved())       # False

PurePath.joinpath(*other):调用此方法等同于将每个 other 参数中的项目连接在一起:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
print(PureWindowsPath('c://').joinpath('1'))    # c:\1
print(PureWindowsPath('c://1').joinpath('/2'))  # c:\2
print(PurePosixPath('/home').joinpath('1'))     # /home/1
print(PurePosixPath('/home').joinpath('/1'))    # /1

PurePath.match(pattern):将此路径与提供的通配符风格的模式匹配。如果匹配成功则返回 True,否则返回 False。
如果 pattern 是相对的,则路径可以是相对路径或绝对路径,并且匹配是从右侧完成的:

print(PurePath('a/b.txt').match(('*.txt')))         # True
print(PurePath('a/b/c.txt').match('b/*.txt'))       # True
print(PurePath('a/b/c.txt').match(('a/*.txt')))     # False

如果 pattern 是绝对的,则路径必须是绝对的,并且路径必须完全匹配:

print(PurePath('a/b.txt').match(('*.txt')))     # True
print(PurePath('a/b/c.txt').match('/*.txt'))    # False

匹配时不区分大小写:

print(PurePath('a/b.Txt').match(('*.txt')))     # True

PurePath.relative_to(*other):计算此路径相对 other 表示路径的版本。如果不可计算,则抛出 ValueError:

print(PurePath('a/b.Txt').relative_to('a'))     # b.Txt

PurePath.with_name(name):返回一个新的路径并修改 name。如果原本路径没有 name,ValueError 被抛出:

print(PurePath('a/b.txt').with_name('c.txt'))     # a\c.txt

PurePath.with_suffix(suffix):返回一个新的路径并修改 suffix。如果原本的路径没有后缀,新的 suffix 则被追加以代替。如果 suffix 是空字符串,则原本的后缀被移除:

print(PurePath('a/b.txt.zip').with_suffix(''))      # a\b.txt
print(PurePath('a/b.txt.zip').with_suffix('.rar'))  # a\b.txt.rar
print(PurePath('a/b').with_suffix('.rar'))          # a\b.rar
上一篇:R入门学习日记03


下一篇:几行Python代码快速解析、整理上万份数据文件