pathlib
这是一个在os.path库的基础上做进一步的高级封装后的库,它将路径字符串封装为一个path对象,进而将os单纯的路径字符串的处理变成了对一个路径字符串的path对象的处理,使用面向对象的处理方式,可以更加方便,更加灵活的对应对各种需求,方便开发者使用。
path对象
PurePath类是 所有Path类的父类,Path 类继承于 PurePath 类,Path可以使用从 PurePath类继承的方法和属性,例如parent,is_abusolute()等方法。并在PurePath类的基础上做了一些扩展方法,因此直接使用Path对象即可。
windowsPath和PosixPath
由于 Windows 操作系统 和 Linux 操作系统 文件系统设计存差异。路径字符串的表示方法有所不同,例如Linux 使用 “ / ” 分隔符而 Windows 使用 “ ”,根目录表示方式也不同。因此针对两套系统创建了WindowsPath类 和 PosixPath类。
在 Windows 操作系统下,默认创建的 Path 对象是 WindowsPath 对象,其余Linux,unix 等满足 POSIX 规范的操作系统都将被创建为 PosixPath 对象。
class Path(PurePath): def __new__(cls, *args, **kwargs): if cls is Path: cls = WindowsPath if os.name == 'nt' else PosixPath # 使用os判断系统类型,创建不同类型的实例对象 self = cls._from_parts(args, init=False) if not self._flavour.is_supported: raise NotImplementedError( "cannot instantiate %r on your system" % (cls.__name__,)) self._init() return self
创建Path对象
创建一个 path 对象非常简单,只需要向Path 类传入一个路径字符串,变可以得到这个路径对应的 path 实例对象,该对象可以被当做一个路径字符进行处理,同时进行大量的使用功能增强。
绝对路径和相对路径对象
由于windows 和 Linux 描述根路径的方式不同,Windows使用“c:\” 符号描述此路径为根,而Posix 使用 “ / ”表示根。
- 绝对路径创建
from pathlib import Path p = Path("/home/user1/python") p # PosixPath('/home/user1/python') p.is_absolute() # True 表示是绝对路径
- 相对路径创建
p2 = Path("home/user1/") p2 # home/user1, 此时p2是一个相对路径,绝对路径为当前文件的绝对路径 # 拼接上p2的路径,即 :path(".") / p2
- 拼接创建
Path("home", "user1", "python") Path("home") / Path("user1") / "python" p2 / "python" # 三种方式都将返回新的PATH对象,都使用了相对路径的拼接home/user1/python # 绝对路径也可以拼接,但注意根只能在字符串开始,否则将会出现问题 # 正常拼接 Path("/root", "abc") # == > PosixPath("/root/abc") # 拼接过程中遇到新的根,将新的根作为起点继续拼接,之前的路径将会忽略 Path("/root", "/abc") # == > PosixPath("/abc") # windows 中遇到拼接根目录,会保留盘符驱动号 >>> PureWindowsPath('c:/Windows', '/Program Files') PureWindowsPath('c:/Program Files')
Path对象属性
- parts 返回分隔符分割后的列表
- root
- parents
- parent
- name
- suffix 获取后缀,无返回 " "
- suffixes 获取后缀们 返回列表,无返回 [ ]
- stem 基名去除后缀(单个)
# 切割各个部分 p = Path('/usr/bin/python3') p.parts # ('/', 'usr', 'bin', 'python3') p.parts[:3] # == > /usr/bin # 获取根 Path('/etc').root p = Path('/foo/bar/setup.py') p.parents # == > 返回一个惰性对象,可正索引,不可超界索引 >>> p.parents[1] PosixPath('/foo') >>> p = Path('/a/b/c/basename') >>> p.parent PosixPath('/a/b/c') >>> p.name 'basename' >>> Path('my/library.tar.gz').suffix '.gz' >>> Path('my/library.tar.gar').suffixes ['.tar', '.gar'] >>> Path('my/library.tar.gz').stem 'library.tar'
Path对象方法
- joinpath(*other)
- match('b/*.py')
- is_absolute()
- with_name(name)
- with_suffix(suffix)
- expanduser()
>>> p = Path('~/films/Monty Python') >>> p.expanduser() PosixPath('/home/eric/films/Monty Python') # 换后缀 >>> p = Path('c:/Downloads/pathlib.tar.gz') >>> p.with_suffix('.bz2') PosixPath('c:/Downloads/pathlib.tar.bz2') >>> p.with_name("hello") PosixPath('c:/Downloads/hello.tar.bz2')
类方法:当前目录和家目录
Path.cwd()
Path.home()
路径的文件类型判断
Path.exists()
Path.is_dir()
Path.is_file()
Path.is_socket()
Path.is_fifo()
Path.is_char_device()
Path.is_block_device()
Path.is_char_device()
路径对应的文件状态信息
Path.stat() # 软链接显示链接文件信息 Path.lstat() # 软链接显示被链接对象信息,非软链接不报错正常显示 Path.owner() Path.group() Path.lchmod(mode)
路径对应文件及元数据的增删改查
Path.touch(mode=0o666, exist_ok=True) Path.rename(target) Path.chmod(mode) Path.mkdir(mode=0o777, parents=False, exist_ok=False) Path.rmdir() Path.replace(target) Path.unlink()
路径对应文件的读写等文件流操作
path对象可以直接调用相应的方法打开文件,读取内部的内容
Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None) Path.read_bytes() Path.read_text(encoding=None, errors=None) Path.write_bytes(data) Path.write_text(data, encoding=None, errors=None) Path.iterdir()
遍历目录
iterdir():不递归的遍历这个目录,返回一个惰性的对象,在os.listdir(dir) 中是返回一个列表
filenum,empty_dir,dir_num = 0, 0, 0 for f in Path(".").iterdir(): # 遍历当前目录 if f.is_file(): filenum += 1 if f.is_dir(): for item in f.iterdir(): if item: dir_num += 1 break else: empty_dir += 1
通配符
* 任意字符, ?一个任意,[abc]一个指定字符
glob.glob(pattern) 不递归搜索
glob.rglob(pattern) 递归所有目录进行搜素
返回匹配结果的path对象集合的生产器,惰性对象
glob.match(pattern) 匹配成功返回True
# 对当前目录下的.py结尾文件排序,目录不递归 >>> sorted(Path('.').glob('*.py')) [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')] # 对该目录下,所有目录下的.py 进行排序 >>> sorted(Path('.').glob('*/*.py')) [PosixPath('docs/conf.py')] # 该目录下所有目录中(递归).py文件排序 sorted(Path('.').glob('**/*.py')) [PosixPath('build/lib/pathlib.py'), PosixPath('docs/conf.py'), PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]