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

6.11 目录相关:os、pathlib、shutil

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

py 复制代码
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)

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 遍历目录(不包含子目录)

py 复制代码
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())))

[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 返回当前工作目录

py 复制代码
from icecream import ic
import os
from pathlib import Path

ic(Path.cwd())
ic(os.getcwd())

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 创建目录

py 复制代码
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')  # 已存在,会报错

6.11.6 递归创建目录

py 复制代码
import os

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

6.11.7 删除空目录

py 复制代码
import os
from pathlib import Path

path = Path(r'G:\TCL\Logs2')
path.rmdir()
os.rmdir(r'G:\TCL\Logs3')

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

6.11.8 递归复制目录

py 复制代码
import shutil

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

6.11.9 递归删除目录

py 复制代码
import os
import shutil

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

6.11.10 文件(夹)重命名

py 复制代码
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')  # 重命名后替换

6.11.11 文件(夹)替换

py 复制代码
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')

6.11.12 修改文件(夹)权限

py 复制代码
from pathlib import Path
import os
import stat

path = Path('pathlib.txt')
path.chmod(stat.S_IXOTH)
os.chmod('os.txt', stat.S_IXOTH)

说明:

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下取消只读

相关推荐
coberup1 分钟前
django Forbidden (403)错误解决方法
python·django·403错误
龙哥说跨境32 分钟前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
小白学大数据1 小时前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
flashman9111 小时前
python在word中插入图片
python·microsoft·自动化·word
菜鸟的人工智能之路1 小时前
桑基图在医学数据分析中的更复杂应用示例
python·数据分析·健康医疗
懒大王爱吃狼2 小时前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
秃头佛爷3 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
深度学习lover4 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
API快乐传递者5 小时前
淘宝反爬虫机制的主要手段有哪些?
爬虫·python
阡之尘埃7 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控