• [Python进阶] 目录相关库:os、pathlib、shutil


    6.11 目录相关:os、pathlib、shutil

    6.11.1 遍历目录(包含子目录)

    from icecream import ic
    import os
    
    p1 = r'G:\TCL'
    for _ in os.walk(p1):
        ic(_)
    
    # 获取目录中所有文件名
    files = []
    for dirpath, dirnames, filenames in os.walk(p1):
        files.extend(os.path.join(dirpath, filename) for filename in filenames)
    ic(files)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    16:06:32|> _: (‘G:\TCL’, [‘Cache’, ‘Logs’, ‘Temp’], [])
    16:06:32|> _: (‘G:\TCL\Cache’, [], [‘同步文件.py’])
    16:06:32|> _: (‘G:\TCL\Logs’, [], [‘log.txt’, ‘log.txt.lnk’, ‘loglink.txt’, ‘log_hard.txt’])
    16:06:32|> _: (‘G:\TCL\Temp’, [], [‘640.jpg’])
    16:06:32|> files: [‘G:\TCL\Cache\同步文件.py’,
    ‘G:\TCL\Logs\log.txt’,
    ‘G:\TCL\Logs\log.txt.lnk’,
    ‘G:\TCL\Logs\loglink.txt’,
    ‘G:\TCL\Logs\log_hard.txt’,
    ‘G:\TCL\Temp\640.jpg’]

    6.11.2 遍历目录(不包含子目录)

    from icecream import ic
    import os
    from pathlib import Path
    
    p1 = r'G:\TCL\Logs'
    ic(os.listdir(p1))
    path = Path(p1)
    print((list(path.iterdir())))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    [WindowsPath(‘G:/TCL/Logs/log.txt’), WindowsPath(‘G:/TCL/Logs/log.txt.lnk’), WindowsPath(‘G:/TCL/Logs/loglink.txt’), WindowsPath(‘G:/TCL/Logs/log_hard.txt’), WindowsPath(‘G:/TCL/Logs/Test’)]
    16:28:08|> os.listdir(p1): [‘log.txt’, ‘log.txt.lnk’, ‘loglink.txt’, ‘log_hard.txt’, ‘Test’]

    6.11.3 返回当前工作目录

    from icecream import ic
    import os
    from pathlib import Path
    
    ic(Path.cwd())
    ic(os.getcwd())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    16:16:11|> Path.cwd(): WindowsPath(‘E:/Syncdisk/PythonFiles’)
    16:16:11|> os.getcwd(): ‘E:\Syncdisk\PythonFiles’

    6.11.4 修改当前工作目录

    os.chdir()

    6.11.5 创建目录

    import os
    from pathlib import Path
    
    path1 = Path('by_pathlib')
    path1.mkdir()
    path2 = Path('Temp')
    Path.mkdir(path2)  # 已存在,会报错
    path3 = Path(r'E:\Syncdisk\PythonFiles\Temp\a1\a2')
    Path.mkdir(path3)  # 无法递归创建目录
    path4 = Path(r'E:\Syncdisk\PythonFiles\Temp\a1\a2')
    Path.mkdir(path4, parents=True, exist_ok=True)  # 递归创建目录,存在文件夹也不报错
    os.mkdir('by_os')
    os.mkdir('Test')  # 已存在,会报错
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6.11.6 递归创建目录

    import os
    
    p = r'E:\Syncdisk\PythonFiles\Temp\a1\a2'
    os.makedirs(p, exist_ok=True)  # 递归创建目录,存在文件夹也不报错
    
    • 1
    • 2
    • 3
    • 4

    6.11.7 删除空目录

    import os
    from pathlib import Path
    
    path = Path(r'G:\TCL\Logs2')
    path.rmdir()
    os.rmdir(r'G:\TCL\Logs3')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    说明:这两种方法都只能删除空目录,目录中含有目录或者文件则无法删除。

    6.11.8 递归复制目录

    import shutil
    
    shutil.copytree('G:\TCL\Logs', 'G:\TCL\Logs2', dirs_exist_ok=True)  # dirs_exist_ok为True时,忽略已存在文件
    
    • 1
    • 2
    • 3

    6.11.9 递归删除目录

    import os
    import shutil
    
    shutil.rmtree(r'G:\TCL\Logs3')  # 递归删除目录及其子目录和文件
    os.removedirs(r'G:\TCL\Logs2')  # 只能递归删除空目录,否则会报错
    
    • 1
    • 2
    • 3
    • 4
    • 5

    6.11.10 文件(夹)重命名

    from pathlib import Path
    import os
    import shutil
    
    # 重命名 - 路径相同
    path = Path('pathlib.txt')
    path.rename('pathlib_new.txt')
    os.rename('os.txt', 'os_new.txt')
    shutil.move('shutil.txt', 'shutil_new.txt')
    
    # 重命名 - 路径不同 – 跨分区
    path = Path('pathlib.txt')
    path.rename(r'G:\TCL\pathlib_new.txt')  # 报错
    os.rename('os.txt', r'G:\TCL\os_new.txt')  # 报错
    shutil.move('shutil.txt', r'G:\TCL\shutil_new.txt')  # 移动后重命名
    
    # 重命名 - 路径不同 – 不跨分区
    path = Path('pathlib.txt')
    path.rename(r'E:\TCL\pathlib_new.txt')  # 移动后重命名
    os.rename('os.txt', r'E:\TCL\os_new.txt')  # 移动后重命名
    shutil.move('shutil.txt', r'E:\TCL\shutil_new.txt')  # 移动后重命名
    
    # 重命名 - 已存在同名文件
    path = Path('pathlib.txt')
    path.rename('pathlib_new.txt')  # 无法创建
    os.rename('os.txt', 'os_new.txt')  # 无法创建
    shutil.move('shutil.txt', 'shutil_new.txt')  # 重命名后替换
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    6.11.11 文件(夹)替换

    from pathlib import Path
    import os
    
    # 替换 - 路径相同
    path = Path('pathlib.txt')
    path.replace('pathlib_new.txt')
    os.replace('os.txt', 'os_new.txt')
    
    # 替换 - 路径不同 – 跨分区
    path = Path('pathlib.txt')
    path.replace(r'G:\TCL\pathlib_new.txt')  # 报错
    os.replace('os.txt', r'G:\TCL\os_new.txt')  # 报错
    
    # 替换 - 路径不同 – 不跨分区
    path = Path('pathlib.txt')
    path.replace(r'G:\TCL\pathlib_new.txt')
    os.replace('os.txt', r'G:\TCL\os_new.txt')
    
    # 替换 - 已存在同名文件
    path = Path('pathlib.txt')
    path.replace('pathlib_new.txt')
    os.replace('os.txt', 'os_new.txt')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    6.11.12 修改文件(夹)权限

    from pathlib import Path
    import os
    import stat
    
    path = Path('pathlib.txt')
    path.chmod(stat.S_IXOTH)
    os.chmod('os.txt', stat.S_IXOTH)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    说明:
    chmod()方法语法格式:os.chmod(path, mode)
    参数:
    path – 文件名路径或目录路径。
    mode – 可用以下选项按位或操作生成,目录的读权限表示可以获取目录里文件名列表,执行权限表示可以把工作目录切换到此目录,删除添加目录里的文件必须同时有写和执行权限,文件权限以用户id->组id->其它顺序检验,最先匹配的允许或禁止权限被应用。
    stat.S_IXOTH: 其他用户有执行权0o001
    stat.S_IWOTH: 其他用户有写权限0o002
    stat.S_IROTH: 其他用户有读权限0o004
    stat.S_IRWXO: 其他用户有全部权限(权限掩码)0o007
    stat.S_IXGRP: 组用户有执行权限0o010
    stat.S_IWGRP: 组用户有写权限0o020
    stat.S_IRGRP: 组用户有读权限0o040
    stat.S_IRWXG: 组用户有全部权限(权限掩码)0o070
    stat.S_IXUSR: 拥有者具有执行权限0o100
    stat.S_IWUSR: 拥有者具有写权限0o200
    stat.S_IRUSR: 拥有者具有读权限0o400
    stat.S_IRWXU: 拥有者有全部权限(权限掩码)0o700
    stat.S_ISVTX: 目录里文件目录只有拥有者才可删除更改0o1000
    stat.S_ISGID: 执行此文件其进程有效组为文件所在组0o2000
    stat.S_ISUID: 执行此文件其进程有效用户为文件所有者0o4000
    stat.S_IREAD: windows下设为只读
    stat.S_IWRITE: windows下取消只读

  • 相关阅读:
    【并发】Java并发线程池底层原理详解与源码分析(上)
    03 _ 复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?
    《最新出炉》系列初窥篇-Python+Playwright自动化测试-34-处理https 安全问题或者非信任站点-下篇
    【21天学习挑战赛】分块查找
    【Qt开发流程之】窗口部件
    面向对象的首要特征——封装
    sql笔记
    for循环命名
    flutter 安装流程
    虚拟机中对已经存在的磁盘扩容
  • 原文地址:https://blog.csdn.net/crleep/article/details/133957746