文章目录
- 一、结构介绍
- 二、常用方法及属性
- 2.1 Path类方法
- 2.1.1 resolve()与absolute(): 获取绝对路径
- 2.1.2 stat(): 获得文件属性
- 2.1.3 chmod(): 修改文件权限和时间戳
- 2.1.4 mkdir(): 创建目录
- 2.1.5 rename(): 文件或文件夹重命名,如果路径不同,会移动并重新命名。
- 2.1.6 replace(): 文件或文件夹重命名,如果路径不同,会移动并重新命名,如果存在,则破坏现有目标。
- 2.1.7 rmdir(): 删除目录
- 2.1.8 unlink(): 删除一个文件
- 2.1.9 cwd(): 获得当前工作目录
- 2.1.10 exists(): 判断是否存在文件或目录name
- 2.1.11 home(): 返回电脑的用户目录
- 2.1.12 is_dir(): 检验给出的路径是一个文件
- 2.1.13 is_file(): 检验给出的路径是一个目录
- 2.1.14 is_symlink(): 检验给出的路径是一个符号链接
- 2.1.15 is_absolute(): 判断是否为绝对路径
- 2.1.16 joinpath(): 连接目录与文件名或目录
- 2.1.17 samefile(): 判断两个路径是否相同
- 2.2 Path类属性
- 2.3 Path路径匹配查找
- 2.3.1 iterdir()查找文件夹下的所有文件(返回一个生成器)
- 2.3.2 glob()查找文件夹下所有与 pattern 匹配的文件(返回一个生成器)
- 2.3.3 rglob()查找文件夹下所有子文件夹中与 pattern 匹配的文件(返回一个生成器)
- 2.4 Path文件读写操作
- 2.5 Path操作实例
一、结构介绍
pathlib是跨平台的、面向对象的路径操作模块,可适用于不同的操作系统,其操作对象是各种操作系统中使用的路径(包括绝对路径和相对路径),pathlib有两个主要的类,分别为PurePath和Path。
1.1 PurePath
PurePath访问市级文件系统的“纯路径”,只负责对路径字符串执行操作。PurePath有两个子类,即PurePosixPath和PathWindowsPath,前者用于操作UNIX(包括
Mac OS X)风格的路径,后者用于操作Windows风格的路径。
1.2 Path
Path访问实际文件系统的“真正路径”,Path对象可用于判断对应的文件是否存在、是否为文件、是否为目录等。有两个子类,即PosixPath和WindowsPath,前者用于操作UNIX(包括
Mac OS X)风格的路径,后者用于操作Windows风格的路径。
1.3 PurePath和Path的区别
Path 是 PurePath 的子类,除了支持 PurePath 的各种操作、属性和方法之外,还会真正访问底层的文件系统,包括判断 Path
对应的路径是否存在,获取 Path 对应路径的各种属性(如是否只读、是文件还是文件夹等),甚至可以对文件进行读写。
PurePath 和 Path 最根本的区别在于,PurePath 处理的仅是字符串,而 Path 则会真正访问底层的文件路径,因此它提供了属性和方法来访问底层的文件系统。
1.4 UNIX 和 Windows 风格路径区别
UNIX 风格的路径和 Windows 风格路径的主要区别在于根路径和路径分隔符,UNIX 风格路径的根路径是斜杠(/),而 Windows
风格路径的根路径是盘符(c:);UNIX 风格的路径的分隔符是斜杠(/),而 Windows 风格路径的分隔符是反斜杠(\)。
注意:
考虑到操作系统的不同,在使用 PurePath 类时,如果在 UNIX 或 Mac OS X 系统上使用 PurePath 创建对象,该类的构造方法实际返回的是
PurePosixPath 对象;反之,如果在 Windows 系统上使用 PurePath 创建对象,该类的构造方法返回的是 PureWindowsPath 对象。
考虑到操作系统的不同,Path 类的使用同 PurePath 类。
二、常用方法及属性
2.1 Path类方法
介绍Path实例化用处
from pathlib import Path
shark = Path(Path.home(), "ocean", "animals", Path("fish", "shark.txt"))
print(shark)
输出结果如下:
/Users/sammy/ocean/animals/fish/shark.txt
可用于拼接目录,且可字符串和Path实例混用,中间会自动加入对应系统的分隔符。下面方法主要是操作Path(“test_dir”)中的test_dir目录或文件
2.1.1 resolve()与absolute(): 获取绝对路径
from pathlib import Path
a = Path('..\\', 'test.txt')
print(a)
print(a.resolve()) # 将路径绝对化,解析任何符号链接。返回新的路径对象
print(a.absolute()) # 改为绝对路径,不会执行正规化或解析符号链接。 返回一个新的路径对象
输出结果如下:
.
C:\AutoTest_git\Python_Lib\Pathlib
..\test.txt # 第一行为相对目录
C:\Users\Ju_Long\Desktop\test.txt # 第二行解析"..\"并输出绝对目录
C:\Users\Ju_Long\Desktop\Python\..\test.txt # 第三行没有解析"..\"只是做简单的拼接
2.1.2 stat(): 获得文件属性
import stat
from pathlib import Path
a = Path()
print(a.stat()[stat.ST_MODE])
输出结果如下:
16895
其中ST_MODE为操作系统中的定义
2.1.3 chmod(): 修改文件权限和时间戳
import stat
from pathlib import Path
a = Path()
print(a.stat()[stat.ST_MODE])
print(a.chmod(0o777)) # 第一种写法
print(a.chmod(stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH)) # 第二种写法
输出结果如下:
16895
None
2.1.4 mkdir(): 创建目录
from pathlib import Path
a = Path('test_dir')
a.mkdir() # 此处在当前目录创建了一个 test_dir文件夹
# 创建多级目录,如果`parent_directory`不存在,设置`parents=True`将会先创建`parent_directory`,然后再创建`child_directory`
path = Path('parent_directory/child_directory')
path.mkdir(parents=True)
2.1.5 rename(): 文件或文件夹重命名,如果路径不同,会移动并重新命名。
from pathlib import Path
# 将'test_dir'更名为'test_dir1'
a = Path('test_dir')
a.rename('test_dir1')
2.1.6 replace(): 文件或文件夹重命名,如果路径不同,会移动并重新命名,如果存在,则破坏现有目标。
from pathlib import Path
# 将'test_dir'更名为'test_dir1'
a = Path('test_dir1')
a.replace('test_dir2')
2.1.7 rmdir(): 删除目录
from pathlib import Path
# 被删除的文件夹test_dir5必须为空
a = Path('test_dir5')
a.rmdir()
2.1.8 unlink(): 删除一个文件
from pathlib import Path
# 只能删除文件,如果要删除目录,请用rmdir()
a = Path('markdown_test.md')
a.unlink(missing_ok=True) # 如果文件不存在时,会报FileNotFoundError。但当missing_ok=True时,会忽略此报错,相当于rm -f命令
# 注: missing_ok参数只有在Python 3.8版本以上才有
2.1.9 cwd(): 获得当前工作目录
from pathlib import Path
a = Path('markdown_test.md')
print(a.cwd())
输出结果如下:
C:\AutoTest_git\Python_Lib\Pathlib
2.1.10 exists(): 判断是否存在文件或目录name
from pathlib import Path
print(Path('.').exists()) # 输出True
print(Path('setup.py').exists()) # 输出False
2.1.11 home(): 返回电脑的用户目录
from pathlib import Path
print(Path().home()) # 输出 C:\Users\Ju_Long
2.1.12 is_dir(): 检验给出的路径是一个文件
from pathlib import Path
print(Path('.').is_dir()) # 输出 True
2.1.13 is_file(): 检验给出的路径是一个目录
from pathlib import Path
print(Path('.').is_file()) # 输出 False
2.1.14 is_symlink(): 检验给出的路径是一个符号链接
from pathlib import Path
print(Path('Shortcut').is_symlink()) # 输出 False 暂时还没弄明白,在windows中不是快捷方式,在Linux中为软/硬连接
2.1.15 is_absolute(): 判断是否为绝对路径
from pathlib import Path
print(Path('.').is_absolute()) # 输出 False
2.1.16 joinpath(): 连接目录与文件名或目录
from pathlib import Path
# 拼接目录这样写,必须实例化后紧跟joinpath()方法, 并且只有第一个需要加'/'作为根目录标识,其他的以字符串作为拼接
print(Path('C:', '/long').joinpath('windows','a','b')) # 输出结果为 C:\long\windows\a\b
# 像这种先实例化赋值后再调用joinpath()方法的, 无法成功
a = Path('C:/qulong').joinpath('windows','a','b')
print(a.joinpath('windows')) # 输出为 C:\qulong\windows\a\b\windows 此方法无法改变原有的实例a, 故下方输出的仍然是a原有的路径
print(a) # 输出为 C:\qulong\windows\a\b
# 根目录'/'标识符只能使用一次,第二次会将第一次的覆盖
print(Path('c:/windows').joinpath('/Program Files')) # 输出结果为 c:\Program Files
2.1.17 samefile(): 判断两个路径是否相同
from pathlib import Path
# 判断相同的文件名
a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py')
print(a.samefile(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py')) # 输出为 True
# 判断文件名时,必须是路径和文件名都相同才会判定为 Ture。下面路径不同,文件名相同仍然为 False
b = Path(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py')
print(b.samefile(r'C:\Temp\Pathlib\Pathlib.py')) # 输出为 False
# 判断相同路径
c = Path(r'C:\AutoTest_git\Python_Lib\Pathlib')
print(c.samefile(r'C:\AutoTest_git\Python_Lib\Pathlib')) # 输出为 True
# 不同路径,同名文件夹仍然为 False
d = Path(r'C:\AutoTest_git\Python_Lib\Pathlib')
print(d.samefile(r'C:\Temp\Pathlib')) # 输出为 False
2.2 Path类属性
2.2.1 name返回文件名(或文件夹名)、parent返回文件路径、suffix分离文件名和扩展名、
from pathlib import Path
a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py')
print(a.name) # 输出Pathlib.py
print(a.parent) # 输出C:\AutoTest_git\Python_Lib\Pathlib 上级目录
print(a.parent.parent) # 输出C:\AutoTest_git\Python_Lib 上上级目录,可以叠加使用
print(a.suffix) # 输出文件后缀.py
print(a.stem) # 返回文件名Pathlib
2.2.2 suffixes返回多个后缀、root返回根目录、parts返回路径组成部分、anchor返回盘符
from pathlib import Path
a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py.zip')
print(a.suffixes) # 文件可以有多个后缀,返回一个列表['.py', '.zip']
print(a.root) # 返回根目录'\'
print(a.parts) # 返回文件路径各个组成部分('C:\\', 'AutoTest_git', 'Python_Lib', 'Pathlib', 'Pathlib.py.zip')与Path().joinpath()反着用
print(a.anchor) # 返回'C:\' 与root的区别是会返回盘符
2.2.3 parents输出每一级目录(返回一个生成器)
from pathlib import Path
a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py.zip')
for i in a.parents:
print(i) # 输出每一级目录
输出如下:
C:\AutoTest_git\Python_Lib\Pathlib
C:\AutoTest_git\Python_Lib
C:\AutoTest_git
C:\
2.3 Path路径匹配查找
2.3.1 iterdir()查找文件夹下的所有文件(返回一个生成器)
from pathlib import Path
a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib') # 此处必须为路径不能带有文件
print(a.iterdir())
for i in a.iterdir():
print(i)
输出如下:
<generator object Path.iterdir at 0x00000173C3869510>
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.md
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py
C:\AutoTest_git\Python_Lib\Pathlib\test_dir
2.3.2 glob()查找文件夹下所有与 pattern 匹配的文件(返回一个生成器)
from pathlib import Path
a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib')
print(a.glob(f'*.*'))
for i in a.glob(f'*.*'):
print(i)
输出如下
<generator object Path.glob at 0x000001620D769510>
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.md
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py
注:其中有一个写法 -- a.glob(f'**\*.*')中的**\加上去后与a.rglob(f'*.*')函数的用法相同,尽量减少这么用,可读性较差
2.3.3 rglob()查找文件夹下所有子文件夹中与 pattern 匹配的文件(返回一个生成器)
from pathlib import Path
a = Path(r'C:\AutoTest_git\Python_Lib\Pathlib')
print(a.rglob(f'*.*'))
for i in a.rglob(f'*.*'):
print(i)
print('查找.py文件')
for i in a.rglob(f'*.py'):
print(i)
输出如下:
<generator object Path.rglob at 0x0000022B3D0615F0>
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.md
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py
C:\AutoTest_git\Python_Lib\Pathlib\test_dir\test.csv
C:\AutoTest_git\Python_Lib\Pathlib\test_dir\test.py
查找.py文件
C:\AutoTest_git\Python_Lib\Pathlib\Pathlib.py
C:\AutoTest_git\Python_Lib\Pathlib\test_dir\test.py
2.4 Path文件读写操作
个人觉得不是很方便不推荐使用
2.5 Path操作实例
2.5.1 输出目录树
from pathlib import *
def dir_tree(path: [str, Path], level=0):
if Path(path).exists() and Path(path).is_dir():
for file_dir in Path(path).iterdir():
if Path(file_dir).is_dir():
print('| ' * level + '|--' + Path(file_dir).name)
dir_tree(file_dir, level + 1)
elif Path(file_dir).is_file():
print('| ' * level + '|--' + Path(file_dir).name)
else:
print(f'The path does not exist or it isn\'t a directory')
dir_tree(f"C:\AutoTest_git")
输出如下:
|--Python_Lib
| |--Pathlib
| | |--Pathlib.md
| | |--Pathlib.py
| | |--test_dir
| | | |--test.csv
| | | |--test.py
| | | |--test.txt
2.5.2 查找符合条件的文件
def filter_file_list(path, suffix_list: [list, None] = None, sub_dir: bool = False):
"""
path:输入路径,支持文件路径和文件夹路径
sub_dir:当为True时含子目录,为False时不含子目录
suffix_list:文件类型列表,按要求的列出全部符合条件的文件,为空时列出全部文件,如:[".xlsx",".xls"]
"""
if suffix_list is None:
suffix_list = ['.*']
else:
suffix_list = list(set(suffix_list)) # 去除重复的后缀
file_list = []
if Path(path).exists():
# 目标为文件夹
if Path(path).is_dir():
if sub_dir:
for i in suffix_list:
[file_list.append(str(f)) for f in Path(path).rglob(f"*{i}") if Path(f).is_file()]
else:
for i in suffix_list:
[file_list.append(str(f)) for f in Path(path).glob(f"*{i}") if Path(f).is_file()]
elif Path(path).is_file():
file_list = [path]
# 去除临时文件
file_list_temp = []
for y in file_list:
if "~$" in Path(y).stem:
continue
file_list_temp.append(y)
file_list = file_list_temp
return file_list
else:
print("输入有误!")
return []
print(filter_file_list(f"C:\AutoTest_git\Python_Lib\Pathlib", sub_dir=True, suffix_list=['.py', '.csv']))
参考文章: