python 文件 I/O(输入/输出)
一、使用pathlib模块操作目录
- PurePath:代表并不访问实际文件系统的“纯路径”。简单来说,PurePath只是负责对路径字符串执行操作,至于该字符串是否对应实际的路径,它并不关心。PurePath有两个子类,即PurePosixPath和PureWindowsPath,分别代表UNIX风格的路径(包括Mac OS X)和Windows风格的路径。
- Path:代表访问实际文件系统的“真正路径”。Path对象可用于判断对应的文件是否存在、是否为文件、是否为目录等。Path同样有两个子类,即PosixPath和WindowsPath。
1. PurePath的基本功能
代码如下:
from pathlib import *
# 创建PurePath,实际上使用PureWindowsPath
pp = PurePath('setup.py')
print(type(pp)) # <class 'pathlib.PureWindowsPath'>
pp = PurePath('crazyit', 'some/path', 'info')
# 看到输出Windows风格的路径
print(pp) # 'crazyit\some\path\info'
pp = PurePath(Path('crazyit'), Path('info'))
# 看到输出Windows风格的路径
print(pp) # 'crazyit\info'
# 明确指定创建PurePosixPath
pp = PurePosixPath('crazyit', 'some/path', 'info')
# 看到输出Unix风格的路径
print(pp) # crazyit/some/path/info
# 如果不传入参数,默认使用当前路径
pp = PurePath()
print(pp) # .
# 如果传入参数包含多个根路径,则只有最后一个根路径及后面子路径生效
pp = PurePosixPath('/etc', '/usr', 'lib64')
print(pp) # /usr/lib64
pp = PureWindowsPath('c:/Windows', 'd:info')
print(pp) # d:info
# 在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,相当于找和crazyit同一级的info路径
代码如下:
from pathlib import *
# 比较两个Unix风格的路径,区分大小写
print(PurePosixPath('info') == PurePosixPath('INFO')) # False
# 比较两个Windows风格的路径,不区分大小写
print(PureWindowsPath('info') == PureWindowsPath('INFO')) # True
# Windows风格的路径不区分大小写
print(PureWindowsPath('INFO') in {
PureWindowsPath('info') })#True
# Unix风格的路径区分大小写,所以'D:'小于'c:'
print(PurePosixPath('D:') < PurePosixPath('c:')) # True
# Windows风格的路径不区分大小写,所以'd:'(D:)大于'c:'
print(PureWindowsPath('D:') > PureWindowsPath('c:')) #True
# 不同风格的路径可以判断是否相等(总不相等)
print(PureWindowsPath('crazyit') == PurePosixPath('crazyit')) # False
# 不同风格的路径不能判断大小,否则会引发异常
#print(PureWindowsPath('info') < PurePosixPath('info')) # TypeError
pp = PureWindowsPath('abc')
# 将多个路径拼起来(Windows风格的路径)
print(pp / 'xyz' / 'wawa') # abc\xyz\wawa
pp = PurePosixPath('abc')
# 将多个路径拼起来(Unix风格的路径)
print(pp / 'xyz' / 'wawa') # abc/xyz/wawa
pp2 = PurePosixPath('haha', 'hehe')
# 将pp、pp2两个路径连接起来
print(pp / pp2) # abc/haha/hehe
pp = PureWindowsPath('abc', 'xyz', 'wawa')
print(str(pp)) # abc\xyz\wawa
pp = PurePosixPath('abc', 'xyz', 'wawa')
print(str(pp)) # abc/xyz/wawa
2. PurePath的属性和方法
PurePath提供了不少属性和方法,这些属性和方法主要还是用于操作路径字符串。由于PurePath并不真正执行底层的文件操作,也不理会路径字符串在底层是否有对应的路径,因此这些操作有点类似于字符串方法。
- PurePath.parts:该属性返回路径字符串中所包含的各部分。
- PurePath.drive:该属性返回路径字符串中的驱动器盘符。
- PurePath.root:该属性返回路径字符串中的根路径。
- PurePath.anchor:该属性返回路径字符串中的盘符和根路径。
- PurePath.parents:该属性返回当前路径的全部父路径。
- PurePath.parent:该属性返回当前路径的上一级路径,相当于parents[O]的返回值。
- PurePath.name:该属性返回当前路径中的文件名。
- PurePath-suffixes:该属性返回当前路径中的文件所有后缀名。
- PurePath.suffix:该属性返回当前路径中的文件后缀名。相当于suffixes属性返回的列表的最后一个元素。
- PurePath.stem:该属性返回当前路径中的主文件名 、
- PurePath.as_posix():将当前路径转换成UNIX风格的路径。
- PurePath.as_uri():将当前路径转换成URI。只有绝对路径才能转换,否则将会引发ValueError。
- PurePath.is_absolute():判断当前路径是否为绝对路径。
- PurePath.joinpath(*other):将多个路径连接在一起,作用类似于前面介绍的斜杠运算符。
- PurePath.match(pattem):判断当前路径是否匹配指定通配符。
- PurePath.relative_to(*other):获取当前路径中去除基准路径之后的结果。
- PurePath.with name(name):将当前路径中的文件名替换成新文件名。如果当前路径中没有文件名,则会引发ValueErroto
- PurePath.with_suffix(sufHx):将当前路径中的文件后缀名替换成新的后缀名。如果当前路径中没有后缀宮则会添加新的后缀名。
代码如下:
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属