在 python 当中,如果你想控制路径,基本上绕不开 os.path。我希望看完这篇文章以后,熟练使用 python 的你能立刻开始使用 pathlib 模块,一刻也不要耽误。

pathlib 相对于 os.path 有以下优势:

  • pathlib 导入更加清晰;
  • 采用面向对象编程,能同时存储更多状态,os.path 返回的通常只有一个字符串;
  • pathlib 使用更简单
  • 获取路径相关信息

    pathlib 会把路径相关信息都存在一个 Path 的核心类里面,比如用户名,后缀名,上层目录,文件创建时间,文件大小等等。 这些 os.path 是没有办法一次性都给我们的,因为 os.path 调用的函数几乎都是返回字符串格式,不能像 Path 对象这样保存状态。

    1, 获取当前文件路径。这种操作方式可能会包含相对路径信息。

    # 获取当前路径
    current_path = Path(__file__)
    print(current_path)
    

    2,当前文件夹路径。

    current_path = Path('.')
    print(current_path)
    

    3, 获取当前文件和文件夹的元信息。

    st = current_path.stat()
    print(st)
    # 文件大小
    print(st.st_size)
    # 文件时间
    print(st.st_atime)
    

    4,Path(‘.’) 这种方式可以包含相对路径 ../doc 等,如果要获取绝对路径要使用 resolve 获取绝对路径。

    current_path.resolve()
    

    如果路径不存在, 是不会抛出异常的。如果想抛出异常,可以设置参数 strict 设为 True,抛出 FileNotFoundError。

    current_path.resolve(strict=True)
    

    5, 获取父目录。这是 os.path 最被人诟病的一点,你需要不停的通过 os.path.dirname() 去获取父目录,层级多了,心都碎了。 在 pathlib 里,因为采用的是对象形式,可以直接通过 parent 属性获取父目录,父目录同时也是一个 Path 对象,照样可以用 parent 去获取目录。

    parent = current_path.parent.parent.parent
    

    6, 如果需要不停的返回上一级目录,不停的 parent 属性也会让人不厌其烦。pathlib 提供了一种更灵活的机制让你去获取高层父目录, 就是 parents 属性。 parents 会把从根目录开始的所有层级都保存起来,直接通过索引获取对应层级就可以了。

    parents = current_path.parent
    first_p = parents[0]
    second_p = parents[1]
    

    这里有一点非常遗憾,pathlib 没有支持逆向索引,也就是说不能通过 parents[-2] 去达到和 current_path.parent.parent 相同的效果。在实际应用中,这种场景用得还是挺多的,需要通过某个文件获取上层路径,上上层路径。

    # TODO: 可以封装的技能,目前未实现
    parents[-3]
    

    提供一种封装思路:

    def my_parents(self, nagtive_num):
        return self.parents[len(current_path.parents) + nagtive_num]
    

    还有一种思路,重写源码中的 __getitem__ 方法,这里不做深入阐述。

    7, 获取文件名称

    name = current_path.name
    

    8, 获取文件后缀名。

    file_suffix = current_path.suffix
    

    9,获取不含后缀名的文件名。

    file_without_suffix = current_path.stem
    

    1,with_name, 改变文件名, 生成新路径,实际文件不发生变化.

    # 改变文件名为 new_name.py,生成新路径,实际文件不发生变化
    # 原来的文件名封装在 current_path 对象中
    with_name = current_path.with_name('new_name.py')
    

    2, with_suffix, 改变后缀名。

    # 改变后缀名,生成新路径,实际文件不发生变化
    with_suffix = current_path.with_suffix('.new_suffix')
    

    3, 路径拼接。 pathlib 提供了和 os.path.join() 类似的路径拼接方式:

    new_path = current_path.joinpath('join_path')
    

    更重要的是,他提供了一种更直观的方式 /

    new_path = current_path / 'lemon/yuze' / 'yuze_again'
    

    这种方式的实现原理学过测试开发课程的同学应该很容易想到,定义一个除法运算的魔术方法就可以。

    思考:pathlib 可以完全代替 os.path 吗?

    =====请大家尊重原创,如要转载,请注明出处:转载自:https://www.cnblogs.com/wagyuze,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。=====
  • =====有任何疑问,欢迎加微信 qd20150815 (加时请备注:博客园-雨泽)=====

  •