• pathlib的使用


    总的来说,由于pathon3的标准库添加了新成员,pathlib, 它在路径调用时可以更优雅的多。而python2的文件系统中的路径处理,十分糟糕。

    在pathlib中,有两个类最常用,PathPurePath,两者的区别是,后者是纯路径,不支持IO操作。简单的说,这个路径对象不支持打开和读取一个文件。所以为了偷懒,我基本上只用Path。

    我喜欢这个库的原因之一,还包括跨平台的因素,比如你的路径处理可能涉及到windows和linux两个平台。在linux下,路径是/斜杠, 而window是是反斜杠。这两者是不同的,使用pathlib完全不用考虑这个因素, joinpath()方法就可以用于路径的连接操作。

    我强烈推荐先看看Python的官方文档:
    https://docs.python.org/3/library/pathlib.html

    一. Python2与Python3的路径处理的对比

    比如这样一段代码, 把某个模块的根路径添加到python路径的list中:

    import os
    import sys
    curpath=os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'a_diretory')
    sys.path.append(curpath)
    

    上述代码足以彰显Python2的恶劣之处了。对于上面的功能,Python3可以这么写:

    import sys
    from pathlib import Path
    sys.path.append(Path().parent.parent.joinpath('a_diretory'))
    

    注释: Path对象的parent属性,表示当前的路径的父目录, joinpath是路径的连接。

    二. pathlib的几个使用示例

    1. 最简单的使用

    from pathlib import Path
    p1 = Path()  # 当前的模块的路径
    print(p1.absolute())  # 打印当前模块的绝对路径
    
    p2 = Path(r'C:UsersAdminDesktoppythonTest')  # 指定的一个路径对象--某个目录
    print(p2)
    
    p3 = Path(r'C:UsersAdminDesktopfile.txt')    # 指定的一个路径对象--某个文件
    f = open(f3, encoding = 'utf-8')
    print(f.read())
    

    2. 追加路径到Python的sys.path中

    # 获取当前目录的兄弟目录: A_Package_Dir
    module_path = Path().parent.joinpath('A_Package_Dir').absolute() 
    print(module_path)
    
    # A_Package_Dir追加到python的sys.path中
    sys.path.append(str(module_path))  
    
    # 然后就可以在程序中,可以随意importA_Package_Dir目录下的py文件了
    import your_module_name  
    # do something
    

    3. 生成目录树的技巧

    这里我完全参考了下述博文,同时建议你读它: https://blog.csdn.net/triagen/article/details/74623440

    from pathlib import Path
    import sys
    
    def lst_tree(p, n):
        if p.is_file():    #判断是否是文件
            print('|' + '	|' * n + '-' * 4 +  p.name)
        elif p.is_dir():    # 判断是否是目录
            print('|' + '	|' * n + '-' * 4 +  str(p.relative_to(p.parent)) + '\')
            for pt in p.iterdir():
                lst_tree(pt, n + 1)   # 递归
    
    if __name__ == "__main__":
            # 对命令行参数进行判断
        if len(sys.argv) != 1 and Path(sys.argv[1]).exists():
            lst_tree(Path(sys.argv[1]), 0)
        else:
            lst_tree(Path('.'), 0)
    
    

    4. 递归删除一个目录

    from pathlib import Path
    
     # 递归删除dir_abs_path目录下的子文件和子文件夹
    def delete_dir_recursively(dir_abs_path):
        p = Path(dir_abs_path)
        for item in p.iterdir():
            if item.is_file():
                # print('正在删除文件: {}'.format(item))
                item.unlink()
                continue
            if item.iterdir():
                abs_path = p.joinpath(item.name)
                delete_dir_recursively(abs_path)
                # print('正在删除目录: {}'.format(item))
                item.rmdir()
    
    # Pathon学习: 从入门到删库跑路,哈哈!
    t = r'E:project公司的库'  
    delete_dir_recursively(t)
    

    注意,我这里用了unlink()方法,它只能用于删除文件(不能是一个目录)。rmdir()方法,它只能用于删除一个空目录(没有子目录和子文件)。再强调一遍,切记,rmdir()当且仅当这个目录为空时,它才能执行,否则抛出异常。

    这也是我为什么要用递归的原因,因为如此才能确保从最里面的一个文件夹开始删除,这样rmdir()目录的内部向外部,逐层递归执行,才不会出错。

    三. 写在最后

    pathlib几乎可以处理与路径有关的操作的一切,包括glob()方法--路径中使用通配符进行匹配,joinpath()路径的连接,stat()--文件或目录的属性,创建时间,大小,等等。pathlib它太强大了。

    到此,你完全可以抛弃Python2中什么os.xxx了

  • 相关阅读:
    ADB常用命令
    HttpClient4.x 使用cookie保持会话
    HttpClient发起Http/Https请求工具类
    MakeFile 文件的使用
    SQL连接查询和嵌套查询详解
    Linux中进程控制块PCB-------task_struct结构体结构
    Mysql数据库--语句整理/提升/进阶/高级使用技巧
    进程池分析
    mmap和shm共享内存的区别和联系
    IO多路复用模型之epoll实现机制
  • 原文地址:https://www.cnblogs.com/crb912/p/8976948.html
Copyright © 2020-2023  润新知