Python3的系统标准库pathlib模块的 Path 对路径的操作会更简单。甚至可以说pathlib已经可以完全替代os.path,它完全采用面向对象的编程方式,因为Python 文档给它的定义是 Object-oriented filesystem paths(面向对象的文件系统路径),其语义适用于不同的操作系统,它继承纯路径但也提供I/O化操作,在处理配置路径方面十分简单。
在pathlib里一切都是面向对象的,只需要调用指定的方法就可以了
os和pathlib有相对应的函数表
| os 和 os.path | pathlib | 定义说明 |
|---|---|---|
| os.path.abspath() | Path.resolve() | 获取文件绝对路径,返回值为新的路径对象: ( |
| os.chmod() | Path.chmod(mode,*,follwo_symlinks=True) | 改变文件模式和权限 |
| os.mkdir() | Path.mkdir() | 创建文件夹 |
| os.makedirs() | Path.mkdir(mode=511,parents=True,exist_ok=False) | parents 为 true 它们会以默认权限被创建 默认exist_ok = False,目标存在会报错FileExistsError |
| os.rename() | Path.rename(target) | 将文件或目录重命名为给定的 target |
| os.replace() | Path.replace(target) | 将文件名目录重命名为给定的 target |
| os.rmdir() | Path.rmdir() | 移除此目录。此目录必须为空的 |
| os.remove(), os.unlink() | Path.unlink(missing_ok=False) | 移除此文件或符号链接。如果路径指向目录,则用 Path.rmdir() 代替。 missing_ok 为假值(默认),则如果路径不存在将会引发 FileNotFoundError。 |
| os.getcwd() | Path.cwd() | 返回一个新的表示当前目录的路径对象 |
| os.path.exists() | Path.exists() | 此路径是否指向一个已存在的文件或目录: |
| os.path.expanduser() | Path.expanduser() 和 Path.home() | 返回一个表示用户家目录的新路径对象 |
| os.listdir() | Path.iterdir() for childdir in p.iterdir(): print(childdir) |
当路径指向一个目录时,产生该路径下的对象的路径,是一个生成器 |
| os.path.isdir() | Path.is_dir() | 如果路径指向一个目录(或者一个指向目录的符号链接)则返回 True,如果指向其他类型的文件则返回 False |
| os.path.isfile() | Path.is_file() | 如果路径指向一个正常的文件(或者一个指向正常文件的符号链接)则返回 True,如果指向其他类型的文件则返回 False。 |
| os.path.islink() | Path.is_symlink() | 如果路径指向符号链接则返回 True, 否则 False。 |
| os.link() | Path.hardlink_to() | 将此路径设为一个指向与 target 相同文件的硬链接。 |
| os.symlink() | Path.symlink_to() | 将此路径创建为指向 target 的符号链接。在 Windows 下,如果链接的目标是一个目录则 target_is_directory 必须为 true |
| os.readlink() | Path.readlink() | 返回符号链接所指向的路径 |
| os.path.relpath() | Path.relative_to(*ohter) | 计算此路径相对 other 表示路径的版本。如果不可计算,则抛出 ValueError: |
| os.stat() | Path.stat(), Path.owner(), Path.group() | 返回一个 os.stat_result 对象,其中包含有关此路径的信息,例如 os.stat()。 结果会在每次调用此方法时重新搜索。 |
| os.path.isabs() | PurePath.is_absolute() | 返回此路径是否为绝对路径。如果路径同时拥有驱动器符与根路径(如果风格允许)则将被认作绝对路径 |
| os.path.join() | PurePath.joinpath() | |
| os.path.basename() | PurePath.name | 一个表示最后路径组件的字符串 |
| os.path.splitext(path)[0] | PurePath.stem | 最后一个路径组件,除去后缀: |
| os.path.splitext(path)[1] | PurePath.suffix | 最后一个组件的文件扩展名,如果存在 |
| os.path.dirname() | PurePath.parent | 此路径的逻辑父路径 |
| os.path.samefile() | Path.samefile() |
os.stat_result对应结构体成员:
p = Path('setup.py')p.stat().st_mode #文件模式:包括文件类型和文件模式位(即权限位)>>33204p.stat().st_ino #在 Unix 上该值表示索引节点号 (inode number) >>5118049p.stat().st_size #文件大小(以字节为单位) >>5758p.stat().st_rsize #文件的实际大小。 >>os.stat_result' object has no attribute 'st_rsize'p.stat().st_dev #该文件所在设备的标识符 >>2066p.stat().st_nlink #硬链接的数量。 >>1p.stat().st_uid #文件所有者的用户 IDp.stat().st_gid #文件所有者的用户组 ID。p.stat().st_atime #最近的访问时间,以秒为单位。p.stat().st_mtime #最近的修改时间,以秒为单位。p.stat().st_ctime #在 Unix 上表示最近的元数据更改时间p.stat().st_atime_nsp.stat().st_mtime_nsp.stat().st_ctime_nsp.stat().st_blocks #为文件分配的字节块数,每块 512 字节。文件是稀疏文件时,它可能小于 st_size/512。
常用操作
from pathlib import Pathexample_path = Path('/Users/Anders/Documents/abc.gif')print(example_path.suffix) # 返回目录中最后一个部分的扩展名>> .gif# 返回目录中多个扩展名列表example_paths = Path('/Users/Anders/Documents/abc.tar.gz')print(example_paths.suffixes)>> ['.tar', '.gz']# 返回目录中最后一个部分的文件名(但是不包含后缀)example_path = Path('/Users/Anders/Documents/abc.gif')print(example_path.stem)>> abc# 返回目录中最后一个部分的文件名example_path = Path('/Users/Anders/Documents/abc.gif')print(example_path.name)>> abc.gif# 替换目录最后一个部分的文件名并返回一个新的路径new_path1 = example_path.with_name('def.gif')print(new_path1)>> /Users/Anders/Documents/def.gif# 替换目录最后一个部分的文件名并返回一个新的路径new_path2 = example_path.with_suffix('.txt')print(new_path2)>> /Users/Anders/Documents/abc.txt#遍历直接下级文件和文件夹,该方法返回一个生成器example_path = Path.cwd()[path for path in example_path.iterdir()]>>>>/home/q/gregory.peng/gerrit/ql_auto_check/testcase/home/q/gregory.peng/gerrit/ql_auto_check/quectel/home/q/gregory.peng/gerrit/ql_auto_check/ql_auto_config.ini/home/q/gregory.peng/gerrit/ql_auto_check/suitecase/home/q/gregory.peng/gerrit/ql_auto_check/supplementary/home/q/gregory.peng/gerrit/ql_auto_check/__pycache__/home/q/gregory.peng/gerrit/ql_auto_check/programm/home/q/gregory.peng/gerrit/ql_auto_check/build#以获取所有下级文件和文件夹,特别耗时[path for path in path.glob("**/*") ]
文件操作
- 打开文件
open(mode=‘r’, bufferiong=-1, encoding=None, errors=None, newline=None)
from pathlib import Pathexample_path = Path.cwd()with example_path.joinpath('test.txt').open(encoding='utf-8') as f:print(f.read())
- 读写文件
read_text()
read_bytes()
write_text()
write_bytes()
from pathlib import Pathexample_path = Path.cwd()example_path.read_text(encoding='utf-8')
- 文件各种判断
from pathlib import Pathexample_path = Path(__file__)example_path.is_dir() #是否是目录example_path.is_file() #是否是普通文件example_path.is_symlink() #是否是软链接example_path.is_socket() #是否是socket文件example_path.is_block_device() #是否是块设备example_path.is_char_device() #是否是字符设备example_path.is_absolute() #是否是绝对路径example_path.resolve() #返回一个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软链接则直接被解析example_path.absolute() #也可以获取绝对路径,但是推荐resolve()example_path.exists() #该路径是否指向现有的目录或文件:
