文件路径模块pathlib

文章目录

  • 文件路径模块pathlib
    • 1.概述
    • 2.创建路径
      • 2.1.创建非windos平台路径
      • 2.2.动态拼接路径joinpath
      • 2.3.替换文件名称 with_name
      • 2.4.创建固定目录
      • 2.5.创建文件夹和文件
        • 1.创建多级目录mkdir
        • 2.创建空文件
    • 3.路径解析
      • 3.1.根据路径分隔符解析路径parts
      • 3.2.获取父级目录parent
      • 3.3.获取路径最后一个部分name
    • 4.目录内容
      • 4.1.访问路径下所有文件iterdir
      • 4.2.正则匹配文件glob
    • 5.读写文件
    • 6.文件类型
    • 7.文件属性
      • 7.1.stat获取文件属性
      • 7.2.stat判断文件属性方法
    • 8.权限
    • 9.删除
      • 9.1.删除空目录
      • 9.2.删除目录文件

1.概述

前面介绍的os.path模块操作文件路径是基于字符串的底层操作,这篇文章介绍的pathlib模块也是处理文件路径,但是它比os.path模块操作更加方便。
pathlib模块提供了一个面向对象API接口来 解析、创建、测试和处理文件和路径。

2.创建路径

2.1.创建非windos平台路径

PurePath:代表并不访问实际文件系统的“纯路径”,只负责对路径字符串执行操作,不会在磁盘上创建路径及文件。PurePath有两个子类,即PurePosixPath和PathWindowsPath,分别代表UNIX风格的路径和Windows风格的路径。
Path:代表访问实际文件系统的“真正路径”。Path对象可用于判断对应的文件是否存在、是否为文件、是否为目录等。有两个子类,即PosixPath和WindowsPath。

import pathlib# PurePosixPath非windows平台,创建一个路径对象
usr = pathlib.PurePosixPath('/usr')
print(usr)# 拼接路径
usr_local = usr / 'local'
print(usr_local)usr_share = usr / pathlib.PurePosixPath('share')
print(usr_share)root = usr / '..'
print(root)etc = root / '/etc/'
print(etc)

运行结果

/usr
/usr/local
/usr/share
/usr/..
/etc

2.2.动态拼接路径joinpath

如果创建的路径是未知的,可以将各个路径作为参数使用joinpath拼接。

import pathlibroot = pathlib.PurePosixPath('/')
subdirs = ['usr', 'local']
usr_local = root.joinpath(*subdirs)
print(usr_local)

运行结果

/usr/local

2.3.替换文件名称 with_name

当给定一个包含文件的路径时,我们想替换这个路径的文件名称,如果使用分隔符操作虽然可以获取到文件名称进行替换,但是操作有些复杂,这里提供了一个函数能够直接替换文件名称,他们都是返回新对象,原对象保持不变。

  • with_name函数用来替换路径中文件名
  • with_suffix函数修改文件后缀
import pathlibind = pathlib.PurePosixPath('source/pathlib/index.rst')
print(ind)
# 替换文件名称
py = ind.with_name('pathlib_from_existing.py')
print(py)# 替换文件后缀
pyc = py.with_suffix('.pyc')
print(pyc)

运行结果

source/pathlib/index.rst
source/pathlib/pathlib_from_existing.py
source/pathlib/pathlib_from_existing.pyc

2.4.创建固定目录

当我们创建目录时候可以指定一个固定目录,然后在目录后拼接路径。省去了每次都要写一个绝对路径,path类为我们提供了常用的方法,例如home方法获取当前系统的家目录,cwd方法获取当前工作目录。

import pathlibhome = pathlib.Path.home()
print('home: ', home)cwd = pathlib.Path.cwd()
print('cwd : ', cwd)

运行结果

home:  /Users/edy
cwd :  /Users/edy/my_pathlib

2.5.创建文件夹和文件

1.创建多级目录mkdir

mkdir方法可以用来创建多级目录

  • parents = True: 创建中间级父目录
  • exist_ok= True: 目标目录存在时不报错
import pathlibp = pathlib.PurePosixPath('dir/abd')
pathlib.Path(p).mkdir(parents=True, exist_ok=True)
print(p)

2.创建空文件

touch方法用来创建一个空文件,前提是文件创建的路径必须存在,路径不存在则会报错。

from pathlib import Pathmyfile = Path('dir/myfile.txt')
myfile.touch(exist_ok=True)

3.路径解析

3.1.根据路径分隔符解析路径parts

parts属性可以生成根据路径分隔符解析得到的一个路径段序列,返回是一个元组,反应了路径实例的不可变性。

import pathlibp = pathlib.PurePosixPath('/usr/local/lib')
print(p.parts)

运行结果

('/', 'usr', 'local', 'lib')

3.2.获取父级目录parent

获取父级目录有两个属性
parent属性获取一次path路径的父级路径
parents属性返回一个迭代器,他可以不断的获取上级目录,直到文件系统的根目录。

import pathlibp = pathlib.PurePosixPath('/usr/local/lib')
# 获取父级目录
print('parent: {}'.format(p.parent))print('\nhierarchy:')
# 迭代获取父级目录直到系统文件根路径
for up in p.parents:print(up)

运行结果

parent: /usr/localhierarchy:
/usr/local
/usr
/

3.3.获取路径最后一个部分name

name属性获取路径的最后一个部分与os.path.basename函数生成的值相同。
suffix属性获取文件扩展名
stem属性获取不含后缀的文件名

import pathlibp = pathlib.PurePosixPath('./source/pathlib/pathlib_name.py')
print('path  : {}'.format(p))
# 获取文件名称
print('name  : {}'.format(p.name))
# 获取文件后缀
print('suffix: {}'.format(p.suffix))
# 获取文件名称不包含后缀
print('stem  : {}'.format(p.stem))

运行结果

path  : source/pathlib/pathlib_name.py
name  : pathlib_name.py
suffix: .py
stem  : pathlib_name

4.目录内容

path类提供了一些方法用来访问目录列表和发现文件系统中的文件名。

4.1.访问路径下所有文件iterdir

iterdir方法是一个生成器,会返回指定目录中所有内容。如果path不指定一个目录,则iterdir() 抛出 NotADirectoryError

import pathlibp = pathlib.Path('.')# 返回指定路径下所有的文件
for f in p.iterdir():print(f)

4.2.正则匹配文件glob

glob方法根据正则表达式匹配符合条件的文件

import pathlibp = pathlib.Path('.')# 匹配当前路径下my开头,py后缀的文件
for f in p.glob('my_*.py'):print(f)

运行结果

my_parsing_path.py
my_dir_path.py

rglob方法可以递归遍历文件

import pathlibp = pathlib.Path('..')for f in p.rglob('pathlib_*.py'):print(f)

5.读写文件

Path实例包含一些方法读写文件内容,例如read_bytes() or read_text()读取文件内容, use write_bytes() or write_text()写入文件。可以使用open方法打开文件并保留句柄操作文件。

import pathlib# 当前路径下创建文件
f = pathlib.Path('example.txt')f.write_bytes('This is the content'.encode('utf-8'))with f.open('r', encoding='utf-8') as handle:print('read from open(): {!r}'.format(handle.read()))print('read_text(): {!r}'.format(f.read_text('utf-8')))

运行结果

read from open(): 'This is the content'
read_text(): 'This is the content'

6.文件类型

Path类包含了一些方法判断文件的类型。

  • is_file()判断是不是文件类型
  • is_dir()判断是不是目录类型
  • is_symlink()判断是不是软链接类型
  • is_fifo()判断是不是队列
  • is_block_device()判断是不是块设备
  • is_char_device()判断是不是字符设备

7.文件属性

7.1.stat获取文件属性

stat()方法和lstat()方法获取文件属性,lstat方法用来检查可能是软连接的目标状态。这两个方法返回的结果与os.stat和os.lstat方法相同。

import pathlib
import sys
import timeif len(sys.argv) == 1:filename = __file__
else:filename = sys.argv[1]p = pathlib.Path(filename)
stat_info = p.stat()# 文件的绝对路径
print('{}:'.format(filename))
# 文件大小
print('  Size:', stat_info.st_size)
# 文件权限
print('  Permissions:', oct(stat_info.st_mode))
# 文件所有者
print('  Owner:', stat_info.st_uid)
# 文件所在块设备
print('  Device:', stat_info.st_dev)
# 文件创建时间
print('  Created      :', time.ctime(stat_info.st_ctime))
# 文件最后修改时间
print('  Last modified:', time.ctime(stat_info.st_mtime))
# 文件最后方法时间
print('  Last accessed:', time.ctime(stat_info.st_atime))

运行结果

/Users/edy/file_propert.py:Size: 632Permissions: 0o100644Owner: 501Device: 16777220Created      : Mon Feb 13 17:26:24 2023Last modified: Mon Feb 13 17:26:24 2023Last accessed: Mon Feb 13 17:26:24 2023

owner()和group()单独获取文件所有者个分组信息

import pathlibp = pathlib.Path(__file__)print('{} is owned by {}/{}'.format(p, p.owner(), p.group()))

运行结果

/Users/edy/file_propert.py is owned by edy/staff

7.2.stat判断文件属性方法

import os
import pathlib
import statroot = pathlib.Path('test_files')
mode = os.stat(root).st_mode
# 判断文件是否存在.
if root.exists():for f in root.iterdir():f.unlink()
else:root.mkdir()if stat.S_ISREG(mode):  # 判断是否一般文件print('Regular file.')
elif stat.S_ISLNK(mode):  # 判断是否链接文件print('Shortcut.')
elif stat.S_ISSOCK(mode):  # 判断是否套接字文件print('Socket.')
elif stat.S_ISFIFO(mode):  # 判断是否命名管道print('Named pipe.')
elif stat.S_ISBLK(mode):  # 判断是否块设备print('Block special device.')
elif stat.S_ISCHR(mode):  # 判断是否字符设置print('Character special device.')elif stat.S_ISDIR(mode):  # 判断是否目录print('directory.')##额外的两个函数
stat.S_IMODE(mode) # 返回文件权限的chmod格式
print('chmod format.')stat.S_IFMT(mode)  # 返回文件的类型
print('type of fiel.')

8.权限

stat除了获取文件权限,还支持设置文件权限。 下面是设置文件权限的属性列表。

stat.S_ISUID: Set user ID on execution. 不常用
stat.S_ISGID: Set group ID on execution. 不常用
stat.S_ENFMT: Record locking enforced. 不常用
stat.S_ISVTX: Save text image after execution. 在执行之后保存文字和图片
stat.S_IREAD: Read by owner. 对于拥有者读的权限
stat.S_IWRITE: Write by owner. 对于拥有者写的权限
stat.S_IEXEC: Execute by owner. 对于拥有者执行的权限
stat.S_IRWXU: Read, write, and execute by owner. 对于拥有者读写执行的权限
stat.S_IRUSR: Read by owner. 对于拥有者读的权限
stat.S_IWUSR: Write by owner. 对于拥有者写的权限
stat.S_IXUSR: Execute by owner. 对于拥有者执行的权限
stat.S_IRWXG: Read, write, and execute by group. 对于同组的人读写执行的权限
stat.S_IRGRP: Read by group. 对于同组读的权限
stat.S_IWGRP: Write by group. 对于同组写的权限
stat.S_IXGRP: Execute by group. 对于同组执行的权限
stat.S_IRWXO: Read, write, and execute by others. 对于其他组读写执行的权限
stat.S_IROTH: Read by others. 对于其他组读的权限
stat.S_IWOTH: Write by others. 对于其他组写的权限
stat.S_IXOTH: Execute by others. 对于其他组执行的权限

下面通过一个例子演示为文件设置权限

import stat
import pathlib
f = pathlib.Path('pathlib_chmod_example.txt')
if f.exists():f.unlink()
f.write_text('contents')
# stat.S_IMODE转为chmod模式,参数是获取当前文件的权限
existing_permissions = stat.S_IMODE(f.stat().st_mode)
print('文件原始权限: {:o}'.format(existing_permissions))new_permissions = stat.S_IRUSR
# 设置文件新的权限
f.chmod(new_permissions)
# 转换成chmod模式输出
after_permissions = stat.S_IMODE(f.stat().st_mode)
print('After: {:o}'.format(after_permissions))

运行结果

文件原始权限: 644
修改后的权限: 400

9.删除

9.1.删除空目录

删除一个空目录可以使用rmdir,如果删除一个不为空的目录会报错。删除的目录不存在也会报错。

import pathlibp = pathlib.Path('example_dir')print('Removing {}'.format(p))
p.rmdir()

9.2.删除目录文件

对于文件、符号链接、路径,可以使用unlink()删除

import pathlibp = pathlib.Path('touched')p.touch()print('exists before removing:', p.exists())p.unlink()

运行结果

exists before removing: True
exists after removing: False

文件路径模块pathlib相关推荐

  1. new file https 找不到路径_Python3用pathlib模块替代os.path进行文件路径的操作

    本文使用 Zhihu On VSCode 创作并发布 在 Python 3.4 之前和路径相关操作函数都放在 os 模块里面,尤其是os.path这个子模块,可以说os.path模块非常常用.而在 P ...

  2. python的哪个模块提供了文件处理方法_Python处理文件路径有哪些方法?

    在python中找寻路径的方法有很多,当然也有新方法在不断地更新中.对于新手的python小白来说,肯定是越简单越好用的最受欢迎.小编经过一番找寻,为大家带来两种方法,大家可以根据接受情况选择. 老方 ...

  3. pythonpath manager_python 路径操作工具 pathlib,比 os 模块好用太多

    在 python 当中,如果你想控制路径,基本上绕不开 os.path.我希望看完这篇文章以后,熟练使用 python 的你能立刻开始使用 pathlib 模块,一刻也不要耽误. pathlib 相对 ...

  4. python oserror路径not found_详谈Python3 操作系统与路径 模块(os / os.path / pathlib)

    python如何判断一个目录下是否存在某个文件?如果小编突然在人群中很疯或者沉默,那时一定很难过. 1.使用os模块 用os模块中os.path.exists()方法检测是否存在test_file.t ...

  5. mac怎么用c语言写文件路径,Mac 中使用os模块更改文件路径

    cmd+opt+c 复制路径 path='/Applications/MAMP/htdocs/python/day04model/' import sys import os sys.path.app ...

  6. python os.path 模块 路径文件名 新建文件夹 文件 路径 是否存在

    os.path 模块主要用于获取文件的属性. 以下是 os.path 模块的几种常用方法: 方法 说明 os.path.abspath(path) 返回绝对路径 os.path.basename(pa ...

  7. Python 技术篇-不使用os模块遍历文件夹,pathlib库获取直接下级文件和所有下级文件

    pathlib.Path("路径").iterdir() 可以获取直接下级文件和文件夹. pathlib.Path("路径").glob("**/*& ...

  8. Python语言编程学习:文件路径变量修改,利用os模块固定文件父路径,变换文件子路径实现代码

    Python语言编程学习:文件路径变量修改,利用os模块固定文件父路径,变换文件子路径实现代码 目录 文件路径变量修改,利用os模块固定文件父路径,变换文件子路径实现代码

  9. perl 处理文件路径的一些模块

    perl有句格言:There is more than one way to do it.意思就是任何问题用perl都有好几种解决方法.以前处理文件路径的时候都是自己写正则表达式,而用perl的模块来 ...

最新文章

  1. 【SpringCloud】Ribbon:负载均衡
  2. oracle:instance与database,启动过程
  3. 笔记-信息化与系统集成技术-人工智能基础知识
  4. window.addeventlistener 不能调用方法_方法入门(基础篇五)
  5. 计算机无法创建新文件夹,无法创建文件,教您无法新建文件夹怎么办
  6. jdk卸载不干净怎么办_【实用】流氓软件卸载不干净?
  7. facebook, twitter,QQ, google +1, linkedin, disqus,gigya 按钮Network (登录)
  8. 用MFC消息映射机制自定义消息
  9. 1.4. network
  10. DirectX修复工具在线修复版
  11. 布置工作五步法,让工作布置跟高效
  12. android手机微信收藏功能实现,微信小程序实现收藏功能
  13. android 记事本上功能,安卓手机上有多功能记事本app吗?
  14. 热加工作业考研题目答案分享——metal casting 1
  15. 再放宽!这些应届生,可直接落户上海
  16. 如何在电脑上下载python中文版_Python下载-Python中文版官方下载
  17. vue两个数组如何判断值是否相同_vue两个数组如何判断重复的数据?
  18. 异常-异常场景的测试
  19. 【金融量化】什么叫市价单、限价单和停止单?
  20. Archiva 创建私服

热门文章

  1. 声控助手_我从构建声控机器人获得的见解
  2. 快速构造性能测试数据的一个方案
  3. Linux下磁盘IO读写测试工具-FIO详解
  4. Java笔记之房屋出租系统(十一)
  5. 王亟亟的Python学习之路(八)-函数式编程,map(),reduce(),filter()
  6. 与脉搏波PVR波形相关的定量测量参数
  7. 4p营销组合策略案例_营销4P到底是什么?理解营销4P订定你的营销策略架构
  8. 基于WebRTC搭建直播平台
  9. Elo评分系统:使用Clojure对欧洲冠军联赛球队进行排名
  10. el-popconfirm中confirm的使用