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对应结构体成员:

  1. p = Path('setup.py')
  2. p.stat().st_mode #文件模式:包括文件类型和文件模式位(即权限位)>>33204
  3. p.stat().st_ino #在 Unix 上该值表示索引节点号 (inode number) >>5118049
  4. p.stat().st_size #文件大小(以字节为单位) >>5758
  5. p.stat().st_rsize #文件的实际大小。 >>os.stat_result' object has no attribute 'st_rsize'
  6. p.stat().st_dev #该文件所在设备的标识符 >>2066
  7. p.stat().st_nlink #硬链接的数量。 >>1
  8. p.stat().st_uid #文件所有者的用户 ID
  9. p.stat().st_gid #文件所有者的用户组 ID。
  10. p.stat().st_atime #最近的访问时间,以秒为单位。
  11. p.stat().st_mtime #最近的修改时间,以秒为单位。
  12. p.stat().st_ctime #在 Unix 上表示最近的元数据更改时间
  13. p.stat().st_atime_ns
  14. p.stat().st_mtime_ns
  15. p.stat().st_ctime_ns
  16. p.stat().st_blocks #为文件分配的字节块数,每块 512 字节。文件是稀疏文件时,它可能小于 st_size/512。

常用操作

  1. from pathlib import Path
  2. example_path = Path('/Users/Anders/Documents/abc.gif')
  3. print(example_path.suffix) # 返回目录中最后一个部分的扩展名
  4. >> .gif
  5. # 返回目录中多个扩展名列表
  6. example_paths = Path('/Users/Anders/Documents/abc.tar.gz')
  7. print(example_paths.suffixes)
  8. >> ['.tar', '.gz']
  9. # 返回目录中最后一个部分的文件名(但是不包含后缀)
  10. example_path = Path('/Users/Anders/Documents/abc.gif')
  11. print(example_path.stem)
  12. >> abc
  13. # 返回目录中最后一个部分的文件名
  14. example_path = Path('/Users/Anders/Documents/abc.gif')
  15. print(example_path.name)
  16. >> abc.gif
  17. # 替换目录最后一个部分的文件名并返回一个新的路径
  18. new_path1 = example_path.with_name('def.gif')
  19. print(new_path1)
  20. >> /Users/Anders/Documents/def.gif
  21. # 替换目录最后一个部分的文件名并返回一个新的路径
  22. new_path2 = example_path.with_suffix('.txt')
  23. print(new_path2)
  24. >> /Users/Anders/Documents/abc.txt
  25. #遍历直接下级文件和文件夹,该方法返回一个生成器
  26. example_path = Path.cwd()
  27. [path for path in example_path.iterdir()]
  28. >>>>
  29. /home/q/gregory.peng/gerrit/ql_auto_check/testcase
  30. /home/q/gregory.peng/gerrit/ql_auto_check/quectel
  31. /home/q/gregory.peng/gerrit/ql_auto_check/ql_auto_config.ini
  32. /home/q/gregory.peng/gerrit/ql_auto_check/suitecase
  33. /home/q/gregory.peng/gerrit/ql_auto_check/supplementary
  34. /home/q/gregory.peng/gerrit/ql_auto_check/__pycache__
  35. /home/q/gregory.peng/gerrit/ql_auto_check/programm
  36. /home/q/gregory.peng/gerrit/ql_auto_check/build
  37. #以获取所有下级文件和文件夹,特别耗时
  38. [path for path in path.glob("**/*") ]

文件操作

  1. 打开文件

open(mode=‘r’, bufferiong=-1, encoding=None, errors=None, newline=None)

  1. from pathlib import Path
  2. example_path = Path.cwd()
  3. with example_path.joinpath('test.txt').open(encoding='utf-8') as f:
  4. print(f.read())
  1. 读写文件

read_text()
read_bytes()
write_text()
write_bytes()

  1. from pathlib import Path
  2. example_path = Path.cwd()
  3. example_path.read_text(encoding='utf-8')
  1. 文件各种判断
    1. from pathlib import Path
    2. example_path = Path(__file__)
    3. example_path.is_dir() #是否是目录
    4. example_path.is_file() #是否是普通文件
    5. example_path.is_symlink() #是否是软链接
    6. example_path.is_socket() #是否是socket文件
    7. example_path.is_block_device() #是否是块设备
    8. example_path.is_char_device() #是否是字符设备
    9. example_path.is_absolute() #是否是绝对路径
    10. example_path.resolve() #返回一个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软链接则直接被解析
    11. example_path.absolute() #也可以获取绝对路径,但是推荐resolve()
    12. example_path.exists() #该路径是否指向现有的目录或文件: