Pathlib好用吗?对比os.path

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: `pathlib`是Python 3.4引入的模块,提供了一种面向对象的方式来处理文件路径,以替代可能引起混淆的`os.path`字符串操作。从3.6版开始,`open()`及`os`, `shutil`, `os.path`中的函数都支持`pathlib.Path`对象。`pathlib`通过统一使用正斜杠处理不同操作系统路径,简化了代码,如在Windows和Linux上。它还允许直接对文件进行读写操作,减少错误和提高可读性。虽然`pathlib`可能稍慢于传统方法,但在大多数情况下,其易用性和可维护性优点远胜过这点性能损失。因此,推荐使用`pathlib`进行路径操作。

pathlib 模块是在Python3.4版本中首次被引入到标准库中的,作为一个可选模块。

Python3.6开始,内置的 open 函数以及 osshutilos.path 模块中的各种函数都可以正确地使用 pathlib.Path 对象了。

最初,pathlib给人的感觉只是os.path的一个不必要的面向对象版本,

不过,当你实际去了解pathlib之后,会发现pathlib实际上绝不是一个简单的面向对象版本,

而是实实在在的解决了os.path存在的一些问题。

1. os.path VS pathlib

1.1. 路径规范化

对于os.path来说,路径的分隔用正斜杆/)还是反斜杠\)需要自己根据操作系统来确定。

或者,每一个路径拼接的地方,都用os.path.join来连接。

而使用pathlib的话,直接用正斜杠/)即可,不用担心操作系统的不同。

比如:

python

复制代码

import os

# windows系统中测试

os.path.join("a/b", "c.txt")
# 运行结果 错误
# 'a/b\\c.txt'

os.path.join("a", "b", "c.txt")
# 运行结果 正确
# 'a\\b\\c.txt'

从代码可以看出,每一层文件夹都必须用join连接才能正确适应不同系统。

而在pathlib中,则不需要考虑这么多。

python

复制代码

from pathlib import Path

Path("a/b").joinpath("c.txt")
# WindowsPath('a/b/c.txt')

Path("a").joinpath("b").joinpath("c.txt")
# WindowsPath('a/b/c.txt')

使用pathlib,在windows或者linux中,统一使用正斜杠/)来分隔文件夹。

路径规范化之后的好处就是代码更加简洁。

比如:下面这个重命名文件的例子(a/b/c/d.csv => a/b/c.csv

python

复制代码

# os.path 方式
os.rename(os.path.join("a", "b", "c", "d.csv"), os.path.join("a", "b", "c.csv"))

# pathlib 方式
Path("a/b/c/d.csv").reanme("a/b/c.csv")

哪种方式更清晰简洁不言而喻。

1.2. 字符串和对象

为什么要用对象来表示路径?

先看下面3个字符串变量:

python

复制代码

student = '{"name": "databook", "score": "90"}'
graduate_date = "2023-07-01"
home_directory = '/home/databook'

这3个字符串其实代表不同的事物:一种是 JSON blob,一种是日期,一种是文件路径。

再看下面3个用对象表示的变量:

python

复制代码

from datetime import date
from pathlib import Path

student = {"name": "databook", "score": "90"}
graduate_date = date(2023, 7, 1)
home_directory = Path('/home/databook')

用字符串来表示变量确实简洁,但也导致每个变量失去了其本身的意义,

程序无法区分这个变量代表的是JSON,还是日期,还是一个路径,从而增加了程序的不确定性。

程序规模大了,或者复杂性提高了之后,存在很大的隐患。

os.pathpathlib就是这样的关系,os.path使用字符串表示路径,pathlib使用Path对象表示路径。

1.3. 读写文件

pathlib的路径对象(Path)可以直接读写文件,因此也能大大简化读写文件的代码。

不用pathlib的读写文件方式:

python

复制代码

import os

# 读取文件
fp = os.path.join("a", "b.txt")
with open(fp, "r") as f:
    f.read()

# 写入文件
with open(fp, "w") as f:
    f.write("hello")

使用pathlib的话:

python

复制代码

from pathlib import Path

# 读取文件
Path("a/b.txt").read_text()

# 写入文件
Path("a/b.txt").write_text("hello)

2. pathlib的性能

pathlib用面向对象的方式处理路径,难免让人觉得会比传统的方式慢很多,也就是存在性能问题。

那么,pathlib到底会比传统方式慢多少?通过下面的简单示例来看看。

传统方式:

python

复制代码

def a(d="D:/miniconda3/Lib/site-packages"):
    from os import getcwd, walk

    extension = ".py"
    count = 0
    for root, directories, filenames in walk(d):
        for filename in filenames:
            if filename.endswith(extension):
                count += 1
                
    print(f"{count} Python files found")

if __name__ == "__main__":
    import time

    t0 = time.time()
    a()
    t1 = time.time()
    print(t1 - t0)

# 运行结果:
7875 Python files found
0.31201744079589844

pathlib方式:

python

复制代码

def b(d="D:/miniconda3/Lib/site-packages"):
    from pathlib import Path

    extension = ".py"
    count = 0
    for filename in Path(d).rglob(f"*{extension}"):
        count += 1

    print(f"{count} Python files found")

if __name__ == "__main__":
    import time

    t0 = time.time()
    b()
    t1 = time.time()
    print(t1 - t0)

# 运行结果:
7875 Python files found
0.44898128509521484

读取的标准库中的文件,总共将近8000个文件,运行多次后,时间大概相差0.1秒左右。

pathlib的性能确实略逊于传统方式,但是将近8000个文件,也只慢了0.1秒

如果不是大规模处理文件的话,还是用pathlib更好。

3. 总结

总的来说,与传统的 os.path 模块相比,pathlib 提供了一种更现代和面向对象的方式来处理文件路径。

它支持跨平台的文件路径操作,使得开发者可以更容易地编写可移植的代码。

此外,pathlib 还提供了链式调用的能力,使得代码更加简洁和易读。

因此,为了代码更加简洁、易读和可维护,推荐使用 pathlib 来替代传统的 os.path


转载来源:https://juejin.cn/post/7344567495972929570

相关文章
|
2月前
|
安全 Python
告别 os.path 的繁琐:拥抱 Python 的 pathlib
告别 os.path 的繁琐:拥抱 Python 的 pathlib
393 6
|
Python
Python 技术篇-不使用os模块遍历文件夹,pathlib库获取直接下级文件和所有下级文件
Python 技术篇-不使用os模块遍历文件夹,pathlib库获取直接下级文件和所有下级文件
465 0
Python 技术篇-不使用os模块遍历文件夹,pathlib库获取直接下级文件和所有下级文件
|
Python
Python 技术篇-不使用os模块判断指定路径是文件还是文件夹,使用pathlib库判断文件和文件夹
Python 技术篇-不使用os模块判断指定路径是文件还是文件夹,使用pathlib库判断文件和文件夹
275 0
Python 技术篇-不使用os模块判断指定路径是文件还是文件夹,使用pathlib库判断文件和文件夹
pathlib一个优雅的路径操作模块,碾压os!
pathlib一个优雅的路径操作模块,碾压os!
|
3月前
|
Ubuntu Unix Linux
操作系统的最强入门科普(Unix/Linux篇)
下期文章,小枣君会重点聊聊Windows和macOS那条线。敬请关注! 如果大家觉得文章不错,还请帮忙多多转发!谢谢!
|
3月前
|
Web App开发 缓存 Rust
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
601 0
Vanilla OS:下一代安全 Linux 发行版
|
9月前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
455 10
|
10月前
|
弹性计算 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot是由阿里云推出的操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行等功能,极大提升了Linux系统的使用效率。用户只需通过简单的命令或自然语言描述问题,OS Copilot即可快速提供解决方案并执行相应操作。例如,查询磁盘使用量等常见任务变得轻松快捷。此外,它还支持从文件读取复杂任务定义,进一步简化了操作流程。虽然在某些模式下可能存在小问题,但总体上大大节省了学习和操作时间,提高了工作效率。
355 2
OS Copilot-操作系统智能助手-Linux新手小白的福音
|
10月前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
239 7

推荐镜像

更多