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

pathlib — 面向对象的文件系统路径

pathlib是Python内置库,Python 文档给它的定义是 Object-oriented filesystem paths(面向对象的文件系统路径)。pathlib 提供表示文件系统路径的类,其语义适用于不同的操作系统。路径类在纯路径之间划分,纯路径提供纯粹的计算操作而没有I / O,以及具体路径,它继承纯路径但也提供I / O操作。

基本用法

Path.iterdir()  # 遍历目录的子目录或者文件

Path.is_dir()  # 判断是否是目录(文件夹)

Path.glob()  # 过滤目录(返回生成器)

Path.resolve()  # 返回绝对路径

Path.exists()  # 判断路径是否存在

Path.open()  # 打开文件(支持with)

Path.unlink()  # 删除文件或目录(目录非空触发异常)

基本属性

Path.parts  # 分割路径 类似os.path.split(), 不过返回元组

Path.drive  # 返回驱动器名称

Path.root  # 返回路径的根目录

Path.anchor  # 自动判断返回drive或root

Path.parents  # 返回所有上级目录的列表

改变路径

Path.with_name()  # 更改路径名称, 更改最后一级路径名

Path.with_suffix()  # 更改路径后缀

拼接路径

Path.joinpath()  # 拼接路径

Path.relative_to()  # 计算相对路径

测试路径

Path.match()  # 测试路径是否符合pattern

Path.is_dir()  # 是否是文件

Path.is_absolute()  # 是否是绝对路径

Path.is_reserved()  # 是否是预留路径

Path.exists()  # 判断路径是否真实存在

其他方法

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

Path.home()  # 返回当前用户的home路径对象

Path.stat()  # 返回路径信息, 同os.stat()

Path.chmod()  # 更改路径权限, 类似os.chmod()

Path.expanduser()  # 展开~返回完整路径对象

Path.mkdir()  # 创建目录

Path.rename()  # 重命名路径

Path.rglob()  # 递归遍历所有子目录的文件

列出指定类型的文件

p = pathlib.Path('./')
# print([str(x) for x in p.iterdir() ])

print([i for i in p.glob('*.py')])
#[WindowsPath('01.py'), WindowsPath('2018年Tibet温度统计.py'), WindowsPath('lob.py')]

列出所有子目录

import  pathlib

p = pathlib.Path('./')
print([x for x in p.iterdir() if x.is_dir()])

#当前目录所有文件
p = pathlib.Path('./')
print([x for x in p.iterdir() ])
#[WindowsPath('.idea'), WindowsPath('01.py'), WindowsPath('数据下载.xlsx'), WindowsPath('数据下载3.xlsx')]

#转化为字符串
p = pathlib.Path('./')
print([str(x) for x in p.iterdir() ])
#['.idea', '01.py',  '数据下载.xlsx', '数据下载3.xlsx']

路径拼接 可以使用/符号来拼接路径


p = pathlib.Path('./')
# print([str(x) for x in p.iterdir() ])
q = pathlib.Path(r'F:\cookies\python')

print([str(q/i )  for i in p.glob('*.py')])
print([str(q.joinpath(i))  for i in p.glob('*.py')])
'''
['F:\\cookies\\python\\01.py', 'F:\\cookies\\python\\2018年Tibet温度统计.py', 'F:\\cookies\\python\\lob.py']
['F:\\cookies\\python\\01.py', 'F:\\cookies\\python\\2018年Tibet温度统计.py', 'F:\\cookies\\python\\lob.py']
'''

p = pathlib.Path(r'F:\cookies\python')
q = p / 'learnPython'
print(q)

#F:\cookies\python\learnPython

打开文件


>>> q = q / "hello_world.py"
>>> with q.open() as f:
>>> print(f.readline())
#!/usr/bin/env python

str()bytes()

>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'
>>> bytes(p)
b'/etc'

Pure paths

PurePath 是一个纯路径对象,纯路径对象提供了实际上不访问文件系统的路径处理操作。有三种方法可以访问这些类,我们也称之为flavor。

一个通用的类,代表当前系统的路径风格(实例化为 PurePosixPath 或者 PureWindowsPath):
产生Pure paths的三种方式

class pathlib.PurePath(*pathsegments)
m=pathlib.PurePath('foo', 'some/path', 'bar')
print(m)        #foo\some\path\bar

n=pathlib.PureWindowsPath('foo', 'some/path', 'bar')
print(n)        #foo\some\path\bar


pa=pathlib.PurePath(pathlib.Path('foo'), pathlib.Path('bar'))
print(pa)       #foo\bar

pa=pathlib.PureWindowsPath('foo','bar')
print(pa)       #foo\bar

如果参数为空,则默认指定当前文件夹

print(pathlib.PurePath())
#.

当同时指定多个绝对路径,则使用最后一个


>>> PureWindowsPath('c:/Windows', 'd:bar')
PureWindowsPath('d:bar')
class pathlib.PurePosixPath(*pathsegments)
一个 PurePath 的子类,路径风格不同于 Windows 文件系统:
class pathlib.PureWindowsPath(*pathsegments)
PurePath 的一个子类,路径风格为 Windows 文件系统路径:

常用属性和方法

返回驱动路径名称
>>> PureWindowsPath('c:/Program Files/').drive
'c:'

不太明白
print(pathlib.PureWindowsPath(r'c:/Program Files/').root)   #\

获取不同等级的根目录:parents属性

>>> p = PureWindowsPath('c:/foo/bar/setup.py')
>>> p.parents[0]
PureWindowsPath('c:/foo/bar')

>>> p.parents[1]
PureWindowsPath('c:/foo')

>>> p.parents[2]
PureWindowsPath('c:/')

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

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

访问个别部分:parts
一个元组,可以访问路径的多个组件:

>>> p = PurePath('/usr/bin/python3')
>>> p.parts
('/', 'usr', 'bin', 'python3')

>>> p = PureWindowsPath('c:/Program Files/PSF')
>>> p.parts
('c:\\', 'Program Files', 'PSF')

可以获取文件的名字,包含拓展名。:PurePath.name属性

>>> PureWindowsPath('//some/share/setup.py').name
'setup.py'
>>> PureWindowsPath('//some/share').name
''

最后一个组件的文件扩展名,如果存在::PurePath.suffix
路径的文件扩展名列表:PurePath.suffixes属性

>> PurePosixPath('my/library/setup.py').suffix
'.py'
>>> PurePosixPath('my/library.tar.gz').suffix
'.gz'
>>> PurePosixPath('my/library').suffix
''

>>> PurePosixPath('my/library.tar.gar').suffixes
['.tar', '.gar']
>>> PurePosixPath('my/library.tar.gz').suffixes
['.tar', '.gz']
>>> PurePosixPath('my/library').suffixes
[]

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

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

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

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

PurePath.with_suffix(suffix)

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

>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_suffix('.bz2')
PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
>>> p = PureWindowsPath('README')
>>> p.with_suffix('.txt')
PureWindowsPath('README.txt')

glob()列举文件

>>> sorted(Path('.').glob('*.py'))
[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
>>> sorted(Path('.').glob('*/*.py'))
[PosixPath('docs/conf.py')]
>>> sorted(Path('.').glob('**/*.py'))
[PosixPath('build/lib/pathlib.py'),
 PosixPath('docs/conf.py'),
 PosixPath('pathlib.py'),
 PosixPath('setup.py'),
 PosixPath('test_pathlib.py')]
# The "**" pattern means "this directory and all subdirectories, recursively"

几个 pathlib 的使用例子

统计文件个数
我们可以使用.iterdir方法获取当前文件下的所以文件.

import pathlib
from collections import Counter
now_path = pathlib.Path.cwd()
gen = (i.suffix for i in now_path.iterdir())
print(Counter(gen))

输出:

Counter({'.py': 16, '': 11, '.txt': 1, '.png': 1, '.csv': 1})

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

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

>>> PureWindowsPath('c:/a/b').is_absolute()
True
>>> PureWindowsPath('/a/b').is_absolute()
False
>>> PureWindowsPath('c:').is_absolute()
False
>>> PureWindowsPath('//some/share').is_absolute()
True

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

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

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

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

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

>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
>>> p.with_name('setup.py')
PureWindowsPath('c:/Downloads/setup.py')
>>> p = PureWindowsPath('c:/')
>>> p.with_name('setup.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
    raise ValueError("%r has an empty name" % (self,))
ValueError: PureWindowsPath('c:/') has an empty name
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值