当前位置 > it书童 > 知识体系 > 正文
推荐小册
java高效编程
怎样更高效地用 java 编程

juc并发工具库
java并发编程工具库

设计模式
设计模式

jvm调优
jvm调优

rabbitmq实战
rabbitmq实战

redis实战
redis实战

Keepavlied高可用集群
Keepavlied高可用集群

nginx入门到实战
nginx入门到实战

java调试
java调试中遇到的各种坑

java输入输出流
java输入输出流

PurePath 与 Path

知识体系 it书童 2019-10-03 21:38:53 0赞 0踩 507阅读 0评论

PurePath

PurePath 并不真正执行底层的文件操作,也不理会路径字符串在底层是否有对应的路径

基本操作

from pathlib import *
# 创建 PurePath
pp = PurePath('setup.py')
print(type(pp))  # <class 'pathlib.PurePosixPath'>

pp = PurePath('crazyit', 'some/path', 'info')
print(pp)  # crazyit/some/path/info

pp = PurePath(Path('crazyit'), Path('info'))
print(pp)  # crazyit/some/path/info

# 明确指定创建 windows 风格的 path
pp = PureWindowsPath('crazyit', 'some/path', 'info')
print(pp)  # crazyit\some\path\info

# 如果不传入参数,默认使用当前路径
pp = PurePath()
print(pp)  # .


# 如果传入参数包含多个根路径,则只有最后一个根路径及后面的子路径生效
pp = PurePosixPath('/etc', '/usr', 'lib64')
print(pp)  # /usr/lib64

# 在 Windows 风格中,只有盘符标识才算根路径
pp = PureWindowsPath('c:/Windows', '/Program Files')
print(pp)  # c:\Program Files

# 路径字符串中多出来的 / 和 . 都会被忽略
pp = PurePath('crazyit//info')
print(pp)  # crazyit/info

pp = PurePath('crazyit/./info')
print(pp)  # crazyit/info

pp = PurePath('crazyit/../info')
print(pp)  # crazyit/../info 相当于找同一级别的 info 目录

运算符

PurePath 支持各种比较运算符

from pathlib import *
# 比较两个 Unix 风格的路径,区分大小写
print(PurePosixPath('info') == PurePosixPath('Info'))  # False
# windows 风格不区分大小写
print(PureWindowsPath('info') == PureWindowsPath('Info'))  # True

# 不同风格的路径总不相等,且不能判断大小,会报 TypeError 异常
print(PureWindowsPath('info') == PurePosixPath('info'))  # False
# print(PureWindowsPath('info') < PurePosixPath('info'))  # TypeError

不管是 windows 还是 unix 都支持用 / 作为连接运算符

from pathlib import *
# 用 / 将多个路径拼接
pp = PureWindowsPath('abc')
print(pp / 'xyz' / 'wawa')  # abc\xyz\wawa

pp = PurePosixPath('abc')
print(pp / 'xyz' / 'wawa')  # abc/xyz/wawa

pp2 = PurePosixPath('haha', 'hehe')
print(pp / pp2)  # abc/haha/hehe

转换为字符串

PurePath 的本质是字符串,可以使用 str() 将其恢复到字符串对象,在恢复时会转换为对应平台风格的字符串

from pathlib import *
pp = PureWindowsPath('abc', 'xyz', 'wawa')
print(str(pp))  # abc\xyz\wawa

pp = PurePosixPath('abc', 'xyz', 'wawa')
print(str(pp))  # abc/xyz/wawa

其他属性和方法

from pathlib import *

# 访问drive属性
print(PureWindowsPath('c:/Program Files/').drive)  # c:
print(PureWindowsPath('/Program Files/').drive)  # ''
print(PurePosixPath('/etc').drive)  # ''

# 访问root属性
print(PureWindowsPath('c:/Program Files/').root)  # \
print(PureWindowsPath('c:Program Files/').root)  # ''
print(PurePosixPath('/etc').root)  # /

# 访问anchor属性
print(PureWindowsPath('c:/Program Files/').anchor)  # c:\
print(PureWindowsPath('c:Program Files/').anchor)  # c:
print(PurePosixPath('/etc').anchor)  # /

# 访问parents属性
pp = PurePath('abc/xyz/wawa/haha')
print(pp.parents[0])  # abc\xyz\wawa
print(pp.parents[1])  # abc\xyz
print(pp.parents[2])  # abc
print(pp.parents[3])  # .
# 访问parent属性
print(pp.parent)  # abc\xyz\wawa

# 访问name属性
print(pp.name)  # haha
pp = PurePath('abc/wawa/bb.txt')
print(pp.name)  # bb.txt

pp = PurePath('abc/wawa/bb.txt.tar.zip')
# 访问suffixes属性
print(pp.suffixes[0])  # .txt
print(pp.suffixes[1])  # .tar
print(pp.suffixes[2])  # .zip
# 访问suffix属性
print(pp.suffix)  # .zip
print(pp.stem)  # bb.txt.tar

pp = PurePath('abc', 'xyz', 'wawa', 'haha')
print(pp)  # abc\xyz\wawa\haha
# 转成Unix风格的路径
print(pp.as_posix())  # abc/xyz/wawa/haha
# 将相对路径转换成Uri引发异常
#print(pp.as_uri())  # ValueError
# 创建绝对路径
pp = PureWindowsPath('d:/', 'Python', 'Python3.6')
# 将绝对路径转换成Uri
print(pp.as_uri())  # file:///d:/Python/Python3.6

# 判断当前路径是否匹配指定模式
print(PurePath('a/b.py').match('*.py'))  # True
print(PurePath('/a/b/c.py').match('b/*.py'))  # True
print(PurePath('/a/b/c.py').match('a/*.py'))  # False

pp = PurePosixPath('c:/abc/xyz/wawa')
# 测试relative_to方法
print(pp.relative_to('c:/'))  # abc\xyz\wawa
print(pp.relative_to('c:/abc'))  # xyz\wawa
print(pp.relative_to('c:/abc/xyz'))  # wawa

# 测试with_name方法
p = PureWindowsPath('e:/Downloads/pathlib.tar.gz')
print(p.with_name('fkit.py'))  # e:\Downloads\fkit.py
p = PureWindowsPath('c:/')
#print(p.with_name('fkit.py'))  # ValueError

# 测试with_suffix方法
p = PureWindowsPath('e:/Downloads/pathlib.tar.gz')
print(p.with_suffix('.zip'))  # e:\Downloads\pathlib.tar.zip
p = PureWindowsPath('README')
print(p.with_suffix('.txt'))  # README.txt

Path

Path 是 PurePath 的子类,除了支持 PurePath 的各种操作外,还会真正访问底层的文件系统

获取文件

from pathlib import *
# 获取当前目录
p = Path('.')
# 遍历当前目录下的所有文件和目录 仅限于当前目录
for x in p.iterdir():
    print(x)

# 获取上级目录
p = Path('../')
# 获取上级目录及其所有子目录下的 py 文件
for x in p.glob('**/*.py'):
    print(x)

# 获取指定路径对应的目录
p = Path('/www/web/')
for x in p.glob('**/*.py'):
    print(x)

读写文件

from pathlib import *
p = Path('a_test.txt')
# 写入文件
result = p.write_text('''事了拂衣去
深藏功与名''', encoding='utf-8')
# 返回输出的字符数
print(result)

# 读取文件
content = p.read_text(encoding='utf-8')
print(content)

# 读取字节内容
bb = p.read_bytes()
print(bb)
关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/9/purepath-and-path