路径处理库pathlib使⽤详解
在编程中处理⽂件的读写操作时免不了要和⽂件路径打交道,甚⾄有时候为了完成某些场景功能会变的有些繁琐,以前在Python中操作⽂件路径,我们更多的时候是使⽤os模块。
⽽到了Python3时代后,Python3的系统标准库pathlib模块的 Path 对路径的操作会更简单。甚⾄可以说pathlib已经可以完全替代
os.path,它完全采⽤⾯向对象的编程⽅式,因为Python ⽂档给它的定义是 Object-oriented filesystem paths(⾯向对象的⽂件系统路径),其语义适⽤于不同的操作系统,它继承纯路径但也提供I/O化操作,在处理配置路径⽅⾯⼗分简单。
这⾥要特殊说明下,我们所有的例⼦中都导⼊了pathlib2模块⽽不是pathlib模块,因为简单引⽤官⽅的话说就是⽼版本的pathlib模块已经只作为修复bug模式存在,⽽新版本的pathlib2是以修补更新的pathlib2⽽发布的,⽽且所有的新功能都可以兼容过去的旧版本python。
好了,来让我们看下常⽤的pathlib操作的例⼦汇总:
返回当前⼯作⽬录路径和Home路径
在pathlib⾥⼀切都是⾯向对象的,只需要调⽤指定的⽅法就可以了。
from pathlib2 import Path
# 获取当前⽬录
current_path = Path.cwd()
print(current_path)
# 输出如下:
# /Users/Anders/Documents/
# 获取Home⽬录
home_path = Path.home()
print(home_path)
# 输出如下:
# /Users/Anders
⽗⽬录操作
你可以看到想要获取⼀个路径下上级的⽗⽬录可以⾮常⽅便的直接使⽤⾯向对象的⽅式**.parent**就⾏了,如果还想上⼀级就继续以⼦对象继续操作parent属性就可以了。
# 获取当前⽬录
current_path = Path.cwd()
# 获取上级⽗⽬录
print(current_path.parent)
# 获取上上级⽗⽬录
print(current_path.parent.parent)
# 获取上上上级⽗⽬录
print(current_path.parent.parent.parent)
# 获取上上上上级⽗⽬录
print(current_path.parent.parent.parent.parent)
# 获取上上上上级⽗⽬录
print(current_path.parent.parent.parent.parent.parent)
# 输出如下:
# /Users/Anders/Documents/Jupyter
# /Users/Anders/Documents
# /Users/Anders
# /Users
# /
当然路径是⼗分长的,⽽且在特定的场合我如果想获得每⼀级的⽗⽬录呢,贴⼼的pathlib已经帮我们想到了,使⽤parents属性就可以遍历整个⽗⽬录了,如下例⼦的效果和上⾯的例⼦是完全⼀样的,但是就变的⾮常简便。
# 获取当前⽬录
from pathlib2 import Path
current_path = Path.cwd()
for p in current_path.parents:
print(p)
# 输出如下:
# /Users/Anders/Documents/Jupyter
# /Users/Anders/Documents
# /Users/Anders
# /Users
# /
⽂件名操作
常⽤的⽂件名操作属性如下:
name ⽬录的最后⼀个部分
suffix ⽬录中最后⼀个部分的扩展名
suffixes 返回多个扩展名列表
stem ⽬录最后⼀个部分,没有后缀
with_name(name) 替换⽬录最后⼀个部分并返回⼀个新的路径
with_suffix(suffix) 替换扩展名,返回新的路径,扩展名存在则不变
example_path = Path('/Users/Anders/Documents/abc.gif')
print(example_path.suffix)
# 输出如下:
# .gifgit使用详解
# 返回⽬录中多个扩展名列表
example_paths = Path('/Users/Anders/Documents/')
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/
路径拼接和分解
from pathlib2 import Path
#直接传进⼀个完整字符串
example_path1 = Path('/Users/Anders/Documents/powershell-2.jpg')
#也可以传进多个字符串
example_path2 = Path('/','Users','dongh','Documents','python_learn','pathlib_','')
#也可以利⽤Path.joinpath()
example_path3 = Path('/Users/Anders/Documents/').joinpath('python_learn')
# #利⽤ / 可以创建⼦路径
example_path4 = Path('/Users/Anders/Documents')
example_path5 = example_path4 /'python_learn/pic-2.jpg'
遍历⽂件夹
我们可以在路径对象后⾯直接使⽤**iterdir()**⽅法,该⽅法返回⼀个⽣成器,我们可以循环遍历出所有指定⽬录下的⽬录路径。
example_path = Path('/Users/Anders/Documents')
[path for path in example_path.iterdir()]
# 输出如下:
# [PosixPath('/Users/Anders/Documents/abc.jpg'),
# PosixPath('/Users/Anders/Documents/book-master'),
# PosixPath('/Users/Anders/Documents/Database'),
# PosixPath('/Users/Anders/Documents/Git'),
# PosixPath('/Users/Anders/Documents/AppProjects')]
⽂件操作
⽂件操作是使⽤率⾮常⾼的操作,在pathlib⾥如果要打开⼀个⽂件也⼗分的简单,只需要open⽅法就可以,它的操作语法是:open(mode=‘r’, bufferiong=-1, encoding=None, errors=None, newline=None)
from pathlib2 import Path
example_path = Path('/Users/Anders/Documents/')
with example_path.open(encoding ='GB2312')as f:
ad())
对于简单的⽂件读写,在pathlib库中有⼏个简便的⽅法:
.read_text(): 以⽂本模式打开路径并并以字符串形式返回内容。
.read_bytes(): 以⼆进制/字节模式打开路径并以字节串的形式返回内容。
.write_text(): 打开路径并向其写⼊字符串数据。
.write_bytes(): 以⼆进制/字节模式打开路径并向其写⼊数据。
⽐如可以把之前的例⼦改写如下:
from pathlib2 import Path
example_path = Path('/Users/Anders/Documents/')
ad_text(encoding='GB2312')
创建⽂件夹和删除⽂件夹
关于这⾥的创建⽂件⽬录mkdir⽅法接收两个参数:
parents:如果⽗⽬录不存在,是否创建⽗⽬录。
exist_ok:只有在⽬录不存在时创建⽬录,⽬录已存在时不会抛出异常。
from pathlib2 import Path
example_path = Path('/Users/Anders/Documents/test1/test2/test3')
# 创建⽂件⽬录,在这个例⼦中因为本⾝不存在test1,test2,test3,由于parents为True,所以都会被创建出来。
example_path.mkdir(parents =True, exist_ok =True)
# 删除路径对象⽬录,如果要删除的⽂件夹内包含⽂件就会报错
dir()
判断⽂件及⽂件夹对象是否存在
关于⽂件的判断还有很多相关属性,罗列如下:
is_dir() 是否是⽬录
is_file() 是否是普通⽂件
is_symlink() 是否是软链接
is_socket() 是否是socket⽂件
is_block_device() 是否是块设备
is_char_device() 是否是字符设备
is_absolute() 是否是绝对路径
resolve() 返回⼀个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软链接则直接被解析
absolute() 也可以获取绝对路径,但是推荐resolve()
exists() 该路径是否指向现有的⽬录或⽂件:
部分例⼦可以参照下⾯:
from pathlib2 import Path
example_path = Path('/Users/Anders/Documents/pic-2.jpg')
# 判断对象是否存在
print(ists())
# 输出如下:
# True
# 判断对象是否是⽬录
print(example_path.is_dir())
# 输出如下:
# False
# 判断对象是否是⽂件
print(example_path.is_file())
# 输出如下:
# True
⽂件的信息
只需要通过**.stat()**⽅法就可以返还指定路径的⽂件信息。
from pathlib2 import Path
example_path = Path('/Users/Anders/Documents/pic.jpg')
print(example_path.stat())
# 输出如下:
# os.stat_result(st_mode=33188, st_ino=8598206944, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=38054, st_atime=1549547190, st_mti me=1521009880, st_ctime=1521009883)
print(example_path.stat().st_size)
# 输出如下:
# 38054
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论