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 #文件模式:包括文件类型和文件模式位(即权限位)>>33204
p.stat().st_ino #在 Unix 上该值表示索引节点号 (inode number) >>5118049
p.stat().st_size #文件大小(以字节为单位) >>5758
p.stat().st_rsize #文件的实际大小。 >>os.stat_result' object has no attribute 'st_rsize'
p.stat().st_dev #该文件所在设备的标识符 >>2066
p.stat().st_nlink #硬链接的数量。 >>1
p.stat().st_uid #文件所有者的用户 ID
p.stat().st_gid #文件所有者的用户组 ID。
p.stat().st_atime #最近的访问时间,以秒为单位。
p.stat().st_mtime #最近的修改时间,以秒为单位。
p.stat().st_ctime #在 Unix 上表示最近的元数据更改时间
p.stat().st_atime_ns
p.stat().st_mtime_ns
p.stat().st_ctime_ns
p.stat().st_blocks #为文件分配的字节块数,每块 512 字节。文件是稀疏文件时,它可能小于 st_size/512。
常用操作
from pathlib import Path
example_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 Path
example_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 Path
example_path = Path.cwd()
example_path.read_text(encoding='utf-8')
- 文件各种判断
from pathlib import Path
example_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() #该路径是否指向现有的目录或文件: