在使用Python处理文件路径时,强烈建议使用pathlib。
pathlib以面向对象的方式处理文件路径,既避免了许多陷阱,也能使执行许多路径的相关操纵变得更容易。
本篇总结了常用的使用pathlib进行文件路径处理的方法。
1. 常用操纵
首先介绍如何使用pathlib来完成一些常规的文件路径相关操纵。
1.1. 构造路径
构建路径对象,只需要将文件或文件夹路径的字符串传给Path即可。- from pathlib import Path
- fp = "D:\\temp\\pathlib"
- path = Path(fp)
- path
- # path 对象
- # WindowsPath('D:/temp/pathlib')
复制代码 构造路径对象之后,Path会自动判断出是windows还是linux下的路径。
1.2. 拼接和拆分路径
用字符串来拼接和拆分路径时,最麻烦的就是不同体系中路径分隔符(\ 和 /)的处理。
使用Path对象,可以大概避免此困扰。- new_path = path.joinpath("abc")
- new_path
- # WindowsPath('D:/temp/pathlib/abc')
- new_path = Path(fp, "test.py")
- new_path
- # WindowsPath('D:/temp/pathlib/test.py')
复制代码 使用joinpath或者直接创建Path对象时拼接路径,不需要指定路径分隔符。
使用Path拆分路径也方便,它提供了多个属性来获取文件信息。- my_path = Path(fp, "program.py")
- my_path
- # WindowsPath('D:/temp/pathlib/program.py')
- # 文件完整名
- my_path.name
- # 'program.py'
- # 文件目录
- my_path.parent
- # WindowsPath('D:/temp/pathlib')
- # 文件名(不带后缀)
- my_path.stem
- # 'program'
- # 文件后缀名
- my_path.suffix
- # '.py'
- # 修改文件后缀
- my_path.with_suffix(".go")
- # WindowsPath('D:/temp/pathlib/program.go')
复制代码 1.3. 相对路径和绝对路径
相对路径转换为绝对路径,推荐使用Path对象的resolve方法。- path = Path("main.py")
- path
- # WindowsPath('main.py')
- # 转换为绝对路径
- path.resolve()
- # WindowsPath('D:/projects/python/samples/main.py')
复制代码 1.4. 遍历目次
遍历目次也是常用的文件路径操纵。- fp = "D:\\temp\\pathlib\\a"
- path = Path(fp)
- for f in path.glob("*.txt"):
- print(f)
- # D:\temp\pathlib\a\1.txt
- # D:\temp\pathlib\a\2.txt
- # D:\temp\pathlib\a\3.txt
复制代码 glob函数是只遍历目次下的文件,如果要遍历子目次中的文件,使用rglob函数。- for f in path.rglob("*.txt"):
- print(f)
- # D:\temp\pathlib\a\1.txt
- # D:\temp\pathlib\a\2.txt
- # D:\temp\pathlib\a\3.txt
- # D:\temp\pathlib\a\sub_a\sub_1.txt
复制代码 1.5. 读写文件
传统的读写文件方式,一般都是两个步骤:先通过open函数打开文件,再进行读或者写。- # 写入
- with open("d:\\readme.txt", "w") as f:
- f.write("abcdefg")
- # 读取
- with open("d:\\readme.txt", "r") as f:
- content = f.read()
- print(content)
- # abcdefg
复制代码 使用Path对象,读写操纵更加简单,代码也更清晰。- fp = "d:\\readme.txt"
- path = Path(fp)
- path.write_text("uvwxyz")
- content = path.read_text()
- print(content)
- # uvwxyz
复制代码 2. 更方便的操纵
除了上面的常用操纵,对于下面这些略微复杂文件路径的操纵,
使用Path也能更容易的完成。
2.1. 检查文件或目次是否存在
- fp = "D:\\temp\\pathlib\\a"
- path = Path(fp)
- path.is_dir() # True
- path.is_file() # False
- path.exists() # True
复制代码 2.2. 创建目次
创建目次使用Path对象可以资助我们自动处理异常环境。- path = Path("D:\\temp\\a\\b\\c\\d")
- path.mkdir(exist_ok=True, parents=True)
复制代码 exist_ok和parents参数为了创建文件夹时省了许多判断。
exist_ok=True表现如果文件夹d存在就不创建,也不报错,反之会报错。
parents=True表现文件夹d的上层的各级文件夹如果不存在就自动创建,反之如果文件夹d的上层有不存在的文件夹则报错。
2.3. 路径自动规范化
使用Path来操纵路径,不消过于关心不同操纵体系的路径分割符问题。
在windows体系中,也可以使用linux的路径分割符,好比,下面两种方式都可以正常运行。- fp = "D:\\temp\\pathlib\\a"
- path = Path(fp)
- fp = "D:/temp/pathlib/a"
- 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企服之家,中国第一个企服评测及商务社交产业平台。 |