告别os.path,拥抱pathlib

这篇具有很好参考价值的文章主要介绍了告别os.path,拥抱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的话,直接用反斜杠/)即可,不用担心操作系统的不同。

比如:

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中,则不需要考虑这么多。

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

# 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个字符串变量:

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

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

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

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的读写文件方式:

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的话:

from pathlib import Path

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

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

2. pathlib的性能

pathlib用面向对象的方式处理路径,难免让人觉得会比传统的方式慢很多,也就是存在性能问题。
那么,pathlib到底会比传统方式慢多少?通过下面的简单示例来看看。

传统方式:

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方式:

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://www.toymoban.com/news/detail-838209.html

到了这里,关于告别os.path,拥抱pathlib的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python pathlib模块

    pathlib 模块提供了表示文件系统路径的类,可适用于不同的操作系统。使用 pathlib 模块,相比于 os 模块可以写出更简洁,易读的代码。pathlib 模块中的 Path 类继承自 PurePath,对 PurePath 中的部分方法进行了重载,相比于 os.path 有更高的抽象级别。本文将带你学习如何使用 pathl

    2024年02月06日
    浏览(36)
  • 告别原始 UI 样式,拥抱 Fluent Design 风格 PyQt/PySide 组件库

    这是一个使用 PyQt/PySide 编写的 Fluent Design 风格的组件库,支持亮暗主题无缝切换和自定义主题色,搭配 QtDesigner 可以快速开发美观的界面。github 仓库地址为 https://github.com/zhiyiYo/PyQt-Fluent-Widgets ,演示视频可以在哔哩哔哩上观看。 轻量版 ( AcrylicLabel 不可用): 完整版: 如果项

    2024年02月10日
    浏览(28)
  • Python中pathlib 模块的用法

    pathlib 模块提供了表示文件系统路径的类,可适用于不同的操作系统。 使用 pathlib 模块,相比于 os 模块可以写出更简洁,易读的代码。pathlib 模块中的 Path 类继承自 PurePath,对 PurePath 中的部分方法进行了重载,相比于 os.path 有更高的抽象级别。 本文将带你学习如何使用 pat

    2024年04月17日
    浏览(38)
  • 深入了解Python中的os.path.join函数

    在Python中,处理文件和目录路径是常见的任务。为了简化路径的拼接和操作,Python提供了 os.path 模块,其中的 join 函数是一个非常重要且常用的函数。本文将深入介绍 os.path.join 函数的用法和注意事项,以帮助读者更好地理解和使用该函数。 os.path 模块是Python中用于处理文件

    2024年02月09日
    浏览(42)
  • 【Python】【三分钟】熟练使用 os.path.join()

    【Python】【三分钟】熟练使用 os.path.join() 🌈 欢迎进入我的个人主页,我是高斯小哥!👈 🎓 博主档案: 广东某985本硕,SCI顶刊一作,深耕 深度学习 多年,熟练掌握PyTorch框架。 🔧 技术专长: 擅长处理各类深度学习任务,包括但不限于图像分类、图像重构(去雾去模糊修

    2024年04月25日
    浏览(31)
  • Python分享之路径与文件 (os.path包, glob包)

    路径与文件的简介请参看Linux文件系统 os.path包 os.path包主要是处理路径字符串,比如说\\\'/home/vamei/doc/file.txt\\\',提取出有用信息。 此外,还有下面的方法: os.path.normpath(path)   # 去除路径path中的冗余。比如\\\'/home/vamei/../.\\\'被转化为\\\'/home\\\' os.path还可以查询文件的相关信息(metadata)。文

    2024年02月07日
    浏览(76)
  • Python路径拼接:如何正确使用os.path.join()函数拼接文件路径

    Python路径拼接:如何正确使用os.path.join()函数拼接文件路径 在Python中,路径拼接是一个常见的需求。通常我们需要将多个字符串组合成一个完整的文件路径,然而手动去拼接路径不仅费时费力,还容易出错。因此,Python提供了os.path.join()函数来解决路径拼接问题。 os.path.join

    2024年02月12日
    浏览(35)
  • Python 内幕揭秘:深度刨析 Windows 系统下的 os.path.join()

    项目 描述 Python 官方文档 https://docs.python.org/zh-cn/3/ 搜索引擎 Google 、Bing CPython 3.6 解释器源码 官方下载页面 项目 描述 Windows 操作系统 Windows 10 专业版 类 Unix 操作系统 Kali Linux 2023-04-18 PyCharm 2023.1 (Professional Edition) Python 3.10.6 os.path 模块是 Python 标准库中的一个模块,用于处理与

    2024年02月09日
    浏览(51)
  • python 使用os.path.join对文件夹中的文件进行循环遍历读取

    使用os.path.join()函数 一个情景 当我们需要处理数据时,数据保存在txt文件,或者语音处理wav文件 并且以后多个文件,其代表着某一任务下不同参数得到的结果。 所以我们需要使用路径来读取文件, 如果需要一次性读取多个,那么则循环遍历。 这里需要用到 os.path.join 操作

    2024年02月16日
    浏览(37)
  • mac os系统升级pycharm报Invalid path to Command Line Tools解决办法

    问题: mac os系统升级后,pull/push代码时git报错,报错内容: 解决办法: 1、首先检查是否你的机器安装了Git,如果没有安装,则安装 2、执行 xcode-select --install 命令 如果上述两步还不行,则需要修改idea中Git路径的配置,在shell终端输入 which git 查看git的路径: 如图: 3、完成

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包