公司动态

Python学习:pathlib之Path类 - 路径操作

📅 2026/7/23 21:42:21
Python学习:pathlib之Path类 - 路径操作
一、pathlib 模块简介pathlib 是Python 3.4版本开始加入的 路径处理模块。它将路径本身变成一个对象这个对象自带各种操作方法代码写起来更直观、优雅。但 pathlib 不会取代 os.path。os.path 的路径 是字符串‘C:/Users/test.txt)pthlib 的路径是对象Path(’C:/Users/test.txt)根据官方文档pathlib 模块共分为 6个部分PurePath纯路径。拼接路径、取文件名、取后缀、判断路径是否以指定的后缀结尾等。不读取硬盘不能创建、删除文件且不区分操作系统因此运行速度快PurePosixPath、PureWindowsPath:用于处理不同操作系统的斜杠PurePosixPath专门处理 / 斜杠的路径Linux系统的 /home/userPureWindowsPath专门处理 \ 反斜杠的路径Windows系统的 C:\UsersPath实体路径继承 PurePath 的所有能力并增加访问磁盘的功能因此可创建、删除文件夹读取文件内容等。PosixPath、WindowsPath是 Path 在不同操作系统下的具体实现在 Windows 系统中导入 Path那么 Path 即为 WindowsPath同样的在Linux系统中导入 Path 即为 PosixPath我们要学习的便是 Path二、Path 的常用方法1、系统方法1Path.cwd()获取当前所在目录它自动识别了操作系统的类型并在返回值中体现出来。和 os 模块的用法基本差不多2Path.home()获取用户主目录os 模块获取用户主目录可通过 os.environ 获取到环境变量然后根据操作系统的类型通过 os.environ[USERPROFILE] Windows系统、os.environ[HOME] Linux系统来获取。3Path.chdir()Path.chdir() 是 Ppython 3.11版本以后的新特性使用方法(由于我的系统环境问题无法复现p Path(rE:\os_path_2)p.chdir()4Path.expanduser()将路径字符串中的 ~ 替换成当前用户的主目录路径作用和 os.path.expanduser(~)完全一样区别在于 Path.expanduser()返回的是一个 Path 对象。5Path.resolve()将路径解析为绝对路径示例1将相对路径替换成绝对路径在 E:\os_path_2 目录下有一个 test.txt的文件先切换到目录下由于环境问题我使用的是 os.chdir()示例2将路径中的 .. 和 . 消除.. 返回上一级. 当前目录原始路径为E:\os_path_2\test\next_file\test2\test_2.txt得到的结果并不是原始路径而且还不相同那么说明一个情况Path.resolve() 只负责处理不负责判断是否存在。如果需要判断文件路径是否存在则需要使用到 .exists() 来进行判断。再来说一个 .resolve()的参数Path.resolve() 默认参数为 strictFalse可指定为 strictTrue什么作用再来试一下路径不存在时会报错相当于使用 .exists()只不过一个返回的是 False一个直接抛出 FileNotFoundError 错误。6Path.absolute()负责补全路径头不负责清理路径中的 .. 或 .通过上面这个示例可以看出 Path.resolve() 和 Path.asbolute() 的不同.absolute()是将当前所在目录的路径补全在了 p4 的前面没有处理路径中的 ...resolve()将当前所在目录的路径补在了 p4 的前面而且处理了路径中的 ..2、查询与判断Path.exists() 判断路径是否存在Path.is_dir()判断是否为目录Path.is_file()判断是否为普通文件Path.is_symlink()判断是否为符号连接Path.is_absolute()判断是否为绝对路径Path.stat()获取文件状态信息Path.lstat()获取文件状态信息不跟踪符号链接Path.owner()获取文件所有者UnixPath.group()获取文件所属组UnixPath.readlink()读取符号链接的目标路径3、遍历与搜索Path.iterdir()遍历指定目录下的所有内容得到的是一个可迭代的对象如果目录中有子目录不会再遍历子目录Path.glob() 通配符搜索当前目录可查找特定的文件Path.rglob()递归通配符搜索所有子目录查找指定目录下包括子目录中所有指定类型的文件Path.walk()递归遍历目录树Path.walk() 是 Python 3.12以后引入的一个新方法它和 os.walk() 的用法基本一致但返回的是生成器。可通过 for root, dirs, files 来循环。root当前目录的完整绝对路径dirs当前目录下所有子目录files当前目录下所有文件通过示例可以看到 Path.walk() 是逐层遍历的过程4、创建与删除Path.mkdir(mode0o777, parentsTrue, exist_okTrue)创建目录mode0o777 用于设置目录的权限不常用parentsFalse/True是否自动创建路径中所有不存在的父目录当parentsTrue时相当于os.makedirs(exist_okFalse/True如果目标目录已存在是否报错Path.touch(mode0o777, exist_okTrue)创建文件或更新时间戳Path.rmdir()删除空目录Path.unlink(missing_okFalse)删除文件5、文件操作Path.open(moder)打开文件和os模块的一样Path.read_text(encodingNone)读取文本文件Path.write_text(data, encodingNone)写入文本文件覆盖写入Path.read_test() 和 Path.write_text() 只适合操作小文件如果需要操作大文件则需要使用 Path.open()。在使用时务必加上 encoding 参数以免报错。6、重命名与移动Path.rename(target)重命名文件或目录Path.replace(target)重命名并覆盖已存在的目录以上就是 Path 的常用方法我将它们分成了6类基本可以满足日常需求。四、一个示例os模块学习过程中做了一个桌面文件整理的脚本在学习 pathlib 后对其进行了修改。根据文件扩展名对桌面文件进行归类整理。# import os from pathlib import Path import shutil import datetime # 1、定义变量 # 获取当前用户主目录 home Path.home() # 定义source_path 变量赋值为桌面路径 source_path home / Desktop # 定义目标主目录 desc_path home / Desktop / files # 通过字典定义不同的文件类型归类到指定的分类目录suffix_*** 名称可以自定义文件分类也可自定义 suffix_dict { suffix_txt: [.txt], suffix_zip : [.tar.gz, .zip, .rar, .7z, .tar, .gz, .bz2, .xz], suffix_doc : [.doc, .docx], suffix_pdf : [.pdf], suffix_excel : [.xls, .xlsx], suffix_powerpoint : [.ppt, .pptx], suffix_image : [.jpg, .jpeg, .png, .gif, .bmp, .svg, .webp], suffix_video : [.mp4, .avi, .mkv, .wmv, .mov, .flv, .webm], suffix_audio : [.mp3, .wav, .aac, .ogg, .flac], suffix_exe : [.exe, .msi] } def makedirs_file(): # 创建主目录 # .mkdir(parentsTrue, exist_okTrue)中, parentsTrue 表示创建父目录, exist_okTrue 表示如果目录已存在则不创建,不会报错 desc_path.mkdir(parentsTrue, exist_okTrue) # 创建子目录 for key in suffix_dict.keys(): (desc_path / key).mkdir(parentsTrue, exist_okTrue) def get_and_move_file(source_path): # 创建目录 makedirs_file() # 遍历桌面 for file_path in source_path.iterdir(): # 如果脚本在 Desktop 下则跳过即不移动脚本文件 if file_path.name Path(__file__).name: continue # 只处理文件不处理文件夹 if not file_path.is_file(): continue # 获取文件名和扩展名 name_without_ext file_path.stem ext file_path.suffix # 查找属于哪个分类 target_key None for key, suffix_list in suffix_dict.items(): if ext in suffix_list: target_key key break # 如果找不到匹配则跳过 if target_key is None: print(f{file_path.name} 无法识别的文件类型) continue # 定义目标路径 target_folder desc_path / target_key target_path target_folder / file_path.name # 重名处理如果存在重名的文件则以当前系统时间重命名文件 if target_path.exists(): timestamp datetime.datetime.now().strftime(%Y%m%d%H%M%S) new_name f{name_without_ext}_{timestamp}{ext} target_path target_folder / new_name print(f⚠️ {file_path.name} 已存在重命名为 {new_name}) # 移动文件 try: shutil.move(file_path, target_path) print(f✅ 移动 {file_path.name} → {target_folder}) except Exception as e: print(f❌ 移动失败{file_path.name}错误{e}) if __name__ __main__: get_and_move_file(source_path)学习中如有不足还请指正