当前位置: 首页 > news >正文

文件路径模块pathlib

文件路径模块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
http://www.lryc.cn/news/6688.html

相关文章:

  • spring cloud篇——什么是服务熔断?服务降级?服务限流?spring cloud有什么优势?
  • Tomcat构建
  • 入门深度学习——基于全连接神经网络的手写数字识别案例(python代码实现)
  • 预算砍砍砍,IT运维如何降本增效
  • 10.Jenkins用tags的方式自动发布java应用
  • 2023新华为OD机试题 - 相同数字的积木游戏 1(JavaScript)
  • 重构之改善既有代码的设计(一)
  • Kotlin data class 数据类用法
  • 随笔-老子不想牺牲了
  • 三种查找Windows10环境变量的方法
  • STM32单片机DS18B20测温程序源代码
  • java日志查看工具finder介绍
  • 手写现代前端框架diff算法-前端面试进阶
  • 【半监督医学图像分割 2022 MICCAI】CLLE 论文翻译
  • vivo官网App模块化开发方案-ModularDevTool
  • Python基础-数据类型之数字类型
  • 基于Web的6个完美3D图形WebGL库
  • 界面组件DevExpress Reporting v22.2 - 增强的Web报表组件UI
  • 初学vector
  • Windows10 安装wsl2、Ubuntu相关操作
  • SpringBoot简单使用MongoDB
  • Oracle Data Guard 角色转换(Role Transitions)
  • opencv的TrackBar控件
  • 关于基线长度对双天线GNSS测姿精度的影响
  • 口交换机睿易 RG-NBS1826GC 24 口
  • 如何在Excel中向下拉列表中添加条件
  • 自定义bean 加载到spring IOC容器中
  • [python入门㊻] - python装饰器和类的装饰器
  • 企业级信息系统开发学习1.1 初识Spring——采用Spring配置文件管理Bean
  • CSS盒子模型