pathlib是一个面向对象的文件系统路径,并且集成了文件的读写能力。只要使用 pathlib.Path 对象就可以了,其封装了操作系统的差异性,内部根据系统判断会生成PureWindowsPath或者PurePosixPath。
斜杠 / 拼接路径
拼接后还是Path对象,比os.path.join()代码简单,而且可读性好,用str()可将Path对象转换成路径字符串。
from pathlib import Path etc = Path('/etc') log = etc / 'work' / 'job' / 'log' print(str(log)) # /etc/work/job/log
Path的类方法
Path.cwd() – 当前路径
对于可执行脚本来说,就是脚本所在的路径,等同于Path(‘.’) 或 Path()。
from pathlib import Path current = Path.cwd() import os current_str = os.path.dirname(os.path.abspath(__file__)) print(str(current) == current_str)
Path.home() – home目录
from pathlib import Path print(Path.home()) # C:\Users\Administrator
Path的常用属性
parent – 父路径
返回父路径的Path对象。
from pathlib import Path p = Path('a/b/c/d') print(p.parent) # a/b/c
name = stem + suffix – 文件名
Path.name表示的是最后路径的字符串;如果是文件的话,Path.stem是去掉后缀的名字,suffix是文件后缀。
from pathlib import Path p = Path('/my/library/setup.py') print(p.name) # setup.py print(p.stem) # setup print(p.suffix) # .py
文件判断
exists() – 是否存在
返回True/False,表示文件是否存在。
from pathlib import Path Path('.').exists() # True Path('nonexistentfile').exists() # False
is_dir() – 是否是目录
判断文件是否存在且是目录。
is_file() – 是否是文件
判断文件是否存在且是文件。
is_symlink() – 是否是link
如果路径指向符号链接则返回 True
, 否则 False
。
stat() – 详细信息
返回路径的详细信息。
from pathlib import Path p = Path() print(p.stat()) --------------------------------------------------------------------------------- os.stat_result(st_mode=16895, st_ino=19984723346525615, st_dev=239601270, st_nlink=1, st_uid=0, st_gid=0, st_size=4096, st_atime=1689777235, st_mtime=1689777233, st_ctime=1689490618)
路径解析
expanduser() – 展开~和~user
返回一个新的Path对象,展开了~和~user。
from pathlib import Path p = Path('~/films/Monty Python') p = p.expanduser() print(p.expanduser()) ----------------------- C:\Users\Administrator\films\Monty Python
resolve() – 绝对化且展开link
返回一个新的路径,将路径绝对化,解析任何符号链接。
from pathlib import Path p = Path('docs/../setup.py') p = p.resolve() print(p) # /home/antoine/pathlib/setup.py
relative_to(other) – 相对路径
计算当前路径相对于other的相对路径。如果不可计算,则抛出ValueError。
from pathlib import Path p = Path('/etc/passwd/ssd.txt') q = p.relative_to('/etc') print(q) # passwd\ssd.txt
查找文件
iterdir() – 遍历目录
当路径指向一个目录时,产生该路径下的对象的路径。使用循环,可以深度遍历整个目录。
>>> p = Path('docs') >>> for child in p.iterdir(): child ... PosixPath('docs/conf.py') PosixPath('docs/_templates') PosixPath('docs/make.bat') PosixPath('docs/index.rst') PosixPath('docs/_build') PosixPath('docs/_static') PosixPath('docs/Makefile')
glob(pattern) – 查找文件
当前目录下查找py文件。
>>> sorted(Path('.').glob('*.py')) [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
一级子目录下查找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')]
读写文件
open() – 打开文件
打开当前文件,和内置的open()函数因素。可选参数:(mode=’r’, buffering=-1, encoding=None, errors=None, newline=None)。
p = Path('setup.py') with p.open() as f: f.readline()
read_bytes()
以字节对象的形式返回路径指向的文件的二进制内容:
>>> p = Path('my_binary_file') >>> p.write_bytes(b'Binary file contents') 20 >>> p.read_bytes() b'Binary file contents'
write_bytes(data)
文件不存在则自动创建,将文件以二进制模式打开,写入 data 并关闭:
>>> p = Path('my_binary_file') >>> p.write_bytes(b'Binary file contents') 20 >>> p.read_bytes() b'Binary file contents'
read_text(encoding=None, errors=None)
以字符串形式返回路径指向的文件的解码后文本内容。有和 open()
一样的可选形参。
>>> p = Path('my_text_file') >>> p.write_text('Text file contents') 18 >>> p.read_text() 'Text file contents'
write_text(data, encoding=None, errors=None)
文件不存在则自动创建,将文件以文本模式打开,写入 data 并关闭。有和 open()
一样的可选形参。
>>> p = Path('my_text_file') >>> p.write_text('Text file contents') 18 >>> p.read_text() 'Text file contents'
mkdir(mode=0o777, parents=False, exist_ok=False)
新建给定路径的目录。如果给出了 mode ,它将与当前进程的 umask 值合并来决定文件模式和访问标志。如果路径已经存在,则抛出 FileExistsError。
如果 parents 为真值,任何找不到的父目录都会伴随着此路径被创建;它们会以默认权限被创建,而不考虑 mode 设置(模仿 POSIX 的 mkdir -p 命令)。
如果 parents 为假值(默认),则找不到的父级目录会引发 FileNotFoundError。
如果 exist_ok 为 false(默认),则在目标已存在的情况下抛出 FileExistsError。
如果 exist_ok 为 true, 则 FileExistsError 异常将被忽略(和 POSIX mkdir -p 命令行为相同),但是只有在最后一个路径组件不是现存的非目录文件时才生效。
touch(self, mode=0o666, exist_ok=True)
Create this file with the given access mode, if it doesn’t exist.
rmdir()
删除此目录。此目录必须为空的。