pathlib模块的PurePath和Path

使用pathlib模块操作目录

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

程序在创建PurePath和Path时,既可以传入单个字符串,也可传入多个路径字符串,PurePath会将它们拼接成一个字符串。

from pathlib import *

# 创建PurePath对象,实际上使用PureWindowsPath
pp = PurePath('setup.py')
print(type(pp))  # 

# 输出windows风格路径
p1 = PurePath('helloworld','some/path','info')
print(p1)  # helloworld\some\path\info

# 输出UNIX风格路径
p2 = PurePosixPath('helloyou','some/path','info')
print(p2)  # helloyou/some/path/info

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

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

PurePath有不少属性和方法:

# 访问drive属性:返回字符串中的驱动器盘符
print(PurePath('c:/Program Files/').drive)  # c:
print(PurePath('/Program Files/').drive)  # ''
print(PurePosixPath('/etc').drive)  # ''

# 访问root属性:返回字符串中的根路径
print(PurePath('c:/Program Files/').root)  # \
print(PurePath('c:Program Files/').root)  # ''
print(PurePosixPath('/etc').root)  # /

# 访问anchor属性:返回字符串中的盘符和根路径
print(PurePath('c:/Program Files/').anchor)  # c:\
print(PurePath('c:Program Files/').anchor)  # c:
print(PurePosixPath('/etc').anchor)  # /

# 访问parents属性:返回当前路径的全部父路径
pp = PurePath('abc/xyz/hello/world')
print(pp.parents[0])  # abc\xyz\hello
print(pp.parents[1])  # abc\xyz
print(pp.parents[2])  # abc
print(pp.parents[3])  # .
# 访问parent属性
print(pp.parent)  # abc\xyz\hello

# 访问name属性:返回当前目录的文件名
print(pp.name)  # world
pp = PurePath('abc/xyz/bb.txt')
print(pp.name)  # bb.txt

# 访问suffixes属性:返回路径中的文件所有后缀名
pp = PurePath('abc/xyz/bb.txt.tar.zip')
print(pp.suffixes[0])  # .txt
print(pp.suffixes[1])  # .tar
print(pp.suffixes[2])  # .zip
访问suffix属性
print(pp.suffix)  # .zip


pp = PurePath('abc','xyz','hello','world')
print(pp)  # abc\xyz\hello\world
# 转换成UNIX风格的路径:
print(pp.as_posix())  # abc/xyz/hello/world
# 不是绝对路劲不能将当前路径转换成URI:
print(pp.as_uri())  # raise ValueError
# 将绝对路径转换成URI
pp = PurePath('d:/','python','python3.6')
print(pp.as_uri())  # file:///d:/python/python3.6

# match:判断当前路径是否匹配指定通配符
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

# relative_to:获取当前路径中去除基准路径之后的结果
pp = PurePath('d:/acb/xyz/hello')
print(pp.relative_to('d:/'))  # acb\xyz\hello
print(pp.relative_to('d:/acb'))  # xyz\hello
print(pp.relative_to('d:/acb/xyz'))  # hello

# with_name:将当前路径中的文件名替换成新文件名。如果当前路径中没有文件名,则会引发ValueError
pp = PurePath('d:/acb/xyz/hello')
print(pp.with_name('world.py'))  # d:\acb\xyz\world.py

# with_suffix:将当前路径中的文件后缀名替换成新的后缀名。如果当前文件没有后缀名,则添加新的后缀名
pp = PurePath('d:/acb/xyz/hello')
print(pp.with_suffix('.txt'))  # d:\acb\xyz\hello.txt
2. Path
  1. PathPurePath的子类,它除了支持PurePath的各种操作、属性和方法之外,还会真正访问底层的文件系统,包括判断Path对应的路径是否存在,获取Path对应路径的各种属性(如是否只读、是文件还是文件夹等),甚至可以对文件进行读写。
  2. Path有两个子类:PosixPathWindowsPath
from pathlib import *

# 获取当前目录
p = Path('.')
# iterdir()方法可以遍历当前目录下所有文件和子目录
for x in p.iterdir():
	print(x)

# 获取上一级目录
p = Path('../')
# glob()方法获取Path对应目录及其子目录下匹配指定模式的所有文件
for x in p.glob('**/*.py'):
	print(x)

p = Path('c:/user/python')
for x in p.glob('**/test.py'):
	print(x)
    
####

# 通过write_bytes(data)和Path.write_text(data,encoding=None,errors=None)方法来输出字节数据和文本数据
p = Path('a_test.txt')
# 返回输出的字符数
result = p.write_text('''第一行
... 第二行''', encoding='GBK')
print(result)  # 7

# 通过read_bytes()和read_text(encoding=None,errors=None)方法,分别读取该Path对应文件的字节数据和文本数据
content = p.read_text(encoding='GBK')
print(content)
# 第一行
# 第二行

bb = p.read_bytes()
print(bb)  # b'\xb5\xda\xd2\xbb\xd0\xd0\r\n\xb5\xda\xb6\xfe\xd0\xd0'

你可能感兴趣的:(文件IO)