高效文件处理:Python pathlib实战指南

打印 上一主题 下一主题

主题 869|帖子 869|积分 2607

在使用Python处理文件路径时,强烈建议使用pathlib。
pathlib以面向对象的方式处理文件路径,既避免了许多陷阱,也能使执行许多路径的相关操纵变得更容易。
本篇总结了常用的使用pathlib进行文件路径处理的方法。
1. 常用操纵

首先介绍如何使用pathlib来完成一些常规的文件路径相关操纵。
1.1. 构造路径

构建路径对象,只需要将文件或文件夹路径的字符串传给Path即可。
  1. from pathlib import Path
  2. fp = "D:\\temp\\pathlib"
  3. path = Path(fp)
  4. path
  5. # path 对象
  6. # WindowsPath('D:/temp/pathlib')
复制代码
构造路径对象之后,Path会自动判断出是windows还是linux下的路径。
1.2. 拼接和拆分路径

用字符串来拼接和拆分路径时,最麻烦的就是不同体系中路径分隔符(\ 和 /)的处理。
使用Path对象,可以大概避免此困扰。
  1. new_path = path.joinpath("abc")
  2. new_path
  3. # WindowsPath('D:/temp/pathlib/abc')
  4. new_path = Path(fp, "test.py")
  5. new_path
  6. # WindowsPath('D:/temp/pathlib/test.py')
复制代码
使用joinpath或者直接创建Path对象时拼接路径,不需要指定路径分隔符。
使用Path拆分路径也方便,它提供了多个属性来获取文件信息。
  1. my_path = Path(fp, "program.py")
  2. my_path
  3. # WindowsPath('D:/temp/pathlib/program.py')
  4. # 文件完整名
  5. my_path.name
  6. # 'program.py'
  7. # 文件目录
  8. my_path.parent
  9. # WindowsPath('D:/temp/pathlib')
  10. # 文件名(不带后缀)
  11. my_path.stem
  12. # 'program'
  13. # 文件后缀名
  14. my_path.suffix
  15. # '.py'
  16. # 修改文件后缀
  17. my_path.with_suffix(".go")
  18. # WindowsPath('D:/temp/pathlib/program.go')
复制代码
1.3. 相对路径和绝对路径

相对路径转换为绝对路径,推荐使用Path对象的resolve方法。
  1. path = Path("main.py")
  2. path
  3. # WindowsPath('main.py')
  4. # 转换为绝对路径
  5. path.resolve()
  6. # WindowsPath('D:/projects/python/samples/main.py')
复制代码
1.4. 遍历目次

遍历目次也是常用的文件路径操纵。
  1. fp = "D:\\temp\\pathlib\\a"
  2. path = Path(fp)
  3. for f in path.glob("*.txt"):
  4.     print(f)
  5. # D:\temp\pathlib\a\1.txt
  6. # D:\temp\pathlib\a\2.txt
  7. # D:\temp\pathlib\a\3.txt
复制代码
glob函数是只遍历目次下的文件,如果要遍历子目次中的文件,使用rglob函数。
  1. for f in path.rglob("*.txt"):
  2.     print(f)
  3. # D:\temp\pathlib\a\1.txt
  4. # D:\temp\pathlib\a\2.txt
  5. # D:\temp\pathlib\a\3.txt
  6. # D:\temp\pathlib\a\sub_a\sub_1.txt
复制代码
1.5. 读写文件

传统的读写文件方式,一般都是两个步骤:先通过open函数打开文件,再进行读或者写。
  1. # 写入
  2. with open("d:\\readme.txt", "w") as f:
  3.     f.write("abcdefg")
  4. # 读取
  5. with open("d:\\readme.txt", "r") as f:
  6.     content = f.read()
  7.     print(content)
  8.     # abcdefg
复制代码
使用Path对象,读写操纵更加简单,代码也更清晰。
  1. fp = "d:\\readme.txt"
  2. path = Path(fp)
  3. path.write_text("uvwxyz")
  4. content = path.read_text()
  5. print(content)
  6. # uvwxyz
复制代码
2. 更方便的操纵

除了上面的常用操纵,对于下面这些略微复杂文件路径的操纵,
使用Path也能更容易的完成。
2.1. 检查文件或目次是否存在
  1. fp = "D:\\temp\\pathlib\\a"
  2. path = Path(fp)
  3. path.is_dir() # True
  4. path.is_file() # False
  5. path.exists() # True
复制代码
2.2. 创建目次

创建目次使用Path对象可以资助我们自动处理异常环境。
  1. path = Path("D:\\temp\\a\\b\\c\\d")
  2. path.mkdir(exist_ok=True, parents=True)
复制代码
exist_ok和parents参数为了创建文件夹时省了许多判断。
exist_ok=True表现如果文件夹d存在就不创建,也不报错,反之会报错。
parents=True表现文件夹d的上层的各级文件夹如果不存在就自动创建,反之如果文件夹d的上层有不存在的文件夹则报错。
2.3. 路径自动规范化

使用Path来操纵路径,不消过于关心不同操纵体系的路径分割符问题。
在windows体系中,也可以使用linux的路径分割符,好比,下面两种方式都可以正常运行。
  1. fp = "D:\\temp\\pathlib\\a"
  2. path = Path(fp)
  3. fp = "D:/temp/pathlib/a"
  4. path = Path(fp)
复制代码
3. 与os.path对比

pathlib重要就是为了取代os.path,它们之间的对比整理如下:
路径操纵**pathlib **os.path读取所有文件内容path.read_text()open(path).read()获取绝对文件路径path.resolve()os.path.abspath(path)获取文件名path.nameos.path.basename(path)获取父目次path.parentos.path.dirname(path)获取文件扩展名path.suffixos.path.splitext(path)[1]文件名(不包含扩展名)path.stemos.path.splitext(path)[0]相对路径path.relative_to(parent)os.path.relpath(path, parent)验证路径是否为文件path.is_file()os.path.isfile(path)验证路径是否为目次path.is_dir()os.path.isdir(path)创建目次path.mkdir(parents=True)os.makedirs(path)获取当前目次pathlib.Path.cwd()os.getcwd()获取主目次pathlib.Path.home()os.path.expanduser("~")按模式查找文件path.glob(pattern)glob.iglob(pattern)递归查找文件path.rglob(pattern)glob.iglob(pattern, recursive=True)规格化路径分隔符pathlib.Path(name)os.path.normpath(name)拼接路径Path(paraent, name)os.path.join(parent, name)获取文件大小path.stat().st_sizeos.path.getsize(path)遍历文件树path.walk()os.walk()将文件重定向到新路径path.rename(target)os.rename(path, target)删除文件path.unlink()os.remove(path)对比两种方式,就能体会pathlib的改进带来的利益。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表