朝花夕拾(四) --------python中的os库全指南

目录

Python os模块完全指南:从基础到高阶文件操作

1. 引言:为什么需要os模块?

1.1 os模块的重要性

1.2 适用场景

1.3 os模块的"瑞士军刀"特性

2. os模块基础功能

2.1 文件与目录操作

2.1.1 核心方法介绍

2.1.2 避坑指南

2.2 路径操作(os.path子模块)

2.2.1 关键方法介绍

2.2.2 实战技巧

3. 系统交互与高级功能

3.1 环境变量与进程管理

3.1.1 环境变量操作

3.1.2 进程控制

3.1.3 注意事项

3.2 文件权限与元数据

3.2.1 文件权限管理

3.2.2 文件元数据

3.2.3 跨平台注意事项

4. 实战案例

4.1 案例1:批量重命名文件

4.2 案例2:递归统计目录大小

4.3 案例3:文件搜索工具

5. 常见问题解答(Q&A)

Q1:os.path和pathlib哪个更好?

Q2:为什么os.remove()有时会报PermissionError?

Q3:如何安全地执行系统命令?

6. 总结与扩展学习

6.1 核心要点回顾

6.2 最佳实践建议

6.3 扩展学习推荐

6.4 最终建议


Python os模块完全指南:从基础到高阶文件操作

1. 引言:为什么需要os模块?

在日常的Python开发中,我们经常需要与操作系统进行交互,比如读取文件、创建目录、执行系统命令等。如果直接使用Python的基础功能来完成这些操作,要么非常繁琐,要么根本无法实现。这时,Python标准库中的os模块就派上了大用场。

os模块是Python与操作系统交互的接口,它提供了丰富的函数和方法来处理文件和目录、访问环境变量、执行系统命令等。相比手动拼接路径字符串(如"C:\\Users\\test.txt"),使用os.path.join("C:", "Users", "test.txt")不仅代码更简洁,还能自动处理不同操作系统的路径分隔符差异。

1.1 os模块的重要性

os模块的重要性主要体现在以下几个方面:

  1. ​跨平台兼容性​​:不同操作系统(Windows、Linux、MacOS)对路径、文件权限等的处理方式不同,os模块提供了统一的接口,让你的代码可以在不同平台上运行而无需修改。

  2. ​功能全面​​:从简单的文件操作到复杂的系统交互,os模块几乎涵盖了所有与操作系统相关的功能需求。

  3. ​性能优化​​:os模块中的许多函数都是用C语言实现的,执行效率比纯Python代码高很多。

1.2 适用场景

os模块适用于以下场景:

  • 文件和目录的创建、删除、重命名

  • 路径的拼接、解析和规范化

  • 获取文件属性和元数据

  • 执行系统命令

  • 访问和修改环境变量

  • 进程管理

1.3 os模块的"瑞士军刀"特性

就像瑞士军刀集成了多种工具一样,os模块也集成了大量与操作系统交互的功能。它主要包含以下几类功能:

  1. ​文件和目录操作​​:如os.listdir()os.mkdir()

  2. ​路径操作​​:通过os.path子模块实现

  3. ​系统信息获取​​:如os.name获取操作系统类型

  4. ​进程管理​​:如os.system()执行系统命令

  5. ​环境变量访问​​:通过os.environ实现

2. os模块基础功能

2.1 文件与目录操作

2.1.1 核心方法介绍

os模块提供了丰富的文件和目录操作方法,下面介绍几个最常用的:

  1. ​列出目录内容​​ - os.listdir()

import os# 列出当前目录下的所有文件和子目录
contents = os.listdir('.')
print(contents)
  1. ​创建目录​​ - os.mkdir()os.makedirs()

# 创建单层目录
os.mkdir('new_dir')# 递归创建多层目录
os.makedirs('path/to/new_dir')
  1. ​删除文件或目录​​ - os.remove()os.rmdir()

# 删除文件
os.remove('file.txt')# 删除空目录
os.rmdir('empty_dir')
  1. ​重命名文件或目录​​ - os.rename()

os.rename('old_name.txt', 'new_name.txt')
2.1.2 避坑指南

在使用这些方法时,有几个常见的坑需要注意:

  1. os.makedirs()vs os.mkdir()的区别​​:

    • os.mkdir()只能创建单层目录,如果父目录不存在会报错

    • os.makedirs()会递归创建所有需要的父目录

  2. ​删除非空目录​​:

    • os.rmdir()只能删除空目录

    • 要删除非空目录,可以使用shutil.rmtree()

    import shutil
    shutil.rmtree('non_empty_dir')
  3. ​文件操作异常处理​​:

    文件操作可能会遇到各种异常,如文件不存在、权限不足等,建议使用try-except块处理:

    try:os.remove('file.txt')
    except FileNotFoundError:print("文件不存在")
    except PermissionError:print("权限不足")

2.2 路径操作(os.path子模块)

os.pathos模块的一个子模块,专门用于处理路径相关的操作。它提供了一系列函数来解析、拼接、检查路径。

2.2.1 关键方法介绍
  1. ​路径拼接​​ - os.path.join()

# 跨平台路径拼接
path = os.path.join('folder', 'subfolder', 'file.txt')
print(path)  # 在Windows上输出:folder\subfolder\file.txt# 在Linux/Mac上输出:folder/subfolder/file.txt
  1. ​获取绝对路径​​ - os.path.abspath()

abs_path = os.path.abspath('file.txt')
print(abs_path)  # 输出:/Users/username/project/file.txt
  1. ​检查路径是否存在​​ - os.path.exists()

if os.path.exists('file.txt'):print("文件存在")
else:print("文件不存在")
  1. ​判断路径类型​​:

os.path.isdir('path')  # 是否是目录
os.path.isfile('path') # 是否是文件
os.path.islink('path') # 是否是符号链接
2.2.2 实战技巧
  1. ​路径规范化​​:

    normalized = os.path.normpath("C:/Users//test.txt")
    print(normalized)  # 输出:C:\Users\test.txt
  2. ​获取文件扩展名​​:

    ext = os.path.splitext("data.json")[1]
    print(ext)  # 输出:.json
  3. ​获取文件名和目录名​​:

    dirname = os.path.dirname("/path/to/file.txt")  # /path/to
    basename = os.path.basename("/path/to/file.txt")  # file.txt
  4. ​获取文件大小和时间戳​​:

    size = os.path.getsize('file.txt')  # 文件大小(字节)
    mtime = os.path.getmtime('file.txt')  # 最后修改时间(时间戳)

3. 系统交互与高级功能

3.1 环境变量与进程管理

3.1.1 环境变量操作

环境变量是操作系统提供的全局变量,os模块提供了访问和修改环境变量的接口。

  1. ​获取环境变量​​:

# 获取PATH环境变量
path = os.environ.get('PATH')
print(path)# 获取所有环境变量
for key, value in os.environ.items():print(f"{key}: {value}")
  1. ​设置环境变量​​:

# 临时设置环境变量(仅在当前进程有效)
os.environ['TEMP_DIR'] = '/tmp'

注意:通过os.environ设置的环境变量只在当前Python进程及其子进程中有效,不会影响系统全局环境变量。

3.1.2 进程控制

os模块提供了一些基本的进程控制功能:

  1. ​执行系统命令​​ - os.system()

# 执行ping命令
return_code = os.system("ping -c 4 127.0.0.1")
print(f"命令返回码:{return_code}")
  1. ​启动文件​​ - os.startfile()(Windows特有)

# 用默认程序打开文件
os.startfile("document.pdf")
  1. ​获取进程ID​​:

print("当前进程ID:", os.getpid())
print("父进程ID:", os.getppid())
3.1.3 注意事项
  1. os.system()存在安全风险,特别是当命令字符串包含用户输入时,可能导致命令注入攻击。更安全的替代方案是使用subprocess模块。

  2. os.startfile()是Windows平台特有的函数,在其他平台上不可用。

3.2 文件权限与元数据

在不同操作系统中,文件权限的管理方式各不相同。os模块提供了一些跨平台的文件权限管理方法。

3.2.1 文件权限管理
  1. ​修改文件权限​​ - os.chmod()

# 设置文件权限为755(所有者可读可写可执行,其他用户可读可执行)
os.chmod("script.sh", 0o755)
  1. ​获取文件权限​​:

import statmode = os.stat("file.txt").st_mode
if mode & stat.S_IRUSR:print("所有者有读权限")
if mode & stat.S_IWGRP:print("组用户有写权限")
3.2.2 文件元数据

通过os.stat()可以获取文件的详细元数据:

file_stats = os.stat("file.txt")print(f"文件大小: {file_stats.st_size} 字节")
print(f"最后访问时间: {file_stats.st_atime}")
print(f"最后修改时间: {file_stats.st_mtime}")
print(f"创建时间: {file_stats.st_ctime}")  # Windows上是创建时间,Linux上是最后状态变更时间
3.2.3 跨平台注意事项
  1. 在Windows上,某些权限标志可能无效。

  2. 文件时间戳在不同平台上的精度可能不同。

  3. st_ctime在Windows上表示创建时间,而在Unix-like系统上表示最后状态变更时间。

4. 实战案例

4.1 案例1:批量重命名文件

在实际工作中,我们经常需要对大量文件进行批量重命名。下面是一个使用os模块实现批量重命名的完整示例:

import osdef batch_rename(directory, prefix):"""批量重命名目录中的文件:param directory: 目标目录路径:param prefix: 新文件名前缀"""# 切换到目标目录os.chdir(directory)# 遍历目录中的文件for i, filename in enumerate(os.listdir()):# 跳过目录if os.path.isdir(filename):continue# 获取文件扩展名_, ext = os.path.splitext(filename)# 构造新文件名new_name = f"{prefix}_{i+1}{ext}"# 重命名文件os.rename(filename, new_name)print(f"Renamed: {filename} -> {new_name}")# 使用示例
batch_rename("images", "photo")

​代码说明​​:

  1. 使用os.chdir()切换到目标目录

  2. os.listdir()获取目录内容

  3. os.path.isdir()过滤掉子目录

  4. os.path.splitext()分离文件名和扩展名

  5. os.rename()执行重命名操作

​效果展示​​:

假设images目录下有以下文件:

img1.jpg
img2.png
img3.gif

运行batch_rename("images", "photo")后,目录内容变为:

photo_1.jpg
photo_2.png
photo_3.gif

4.2 案例2:递归统计目录大小

另一个常见需求是计算目录及其子目录的总大小。下面是实现这一功能的代码:

import osdef get_dir_size(path):"""递归计算目录大小(字节):param path: 目录路径:return: 目录总大小(字节)"""total = 0# 使用os.scandir()更高效with os.scandir(path) as it:for entry in it:if entry.is_file():total += entry.stat().st_sizeelif entry.is_dir():total += get_dir_size(entry.path)return totaldef format_size(size):"""格式化文件大小显示:param size: 文件大小(字节):return: 格式化后的字符串"""for unit in ['B', 'KB', 'MB', 'GB']:if size < 1024:return f"{size:.2f}{unit}"size /= 1024return f"{size:.2f}TB"# 使用示例
directory = "/path/to/directory"
size_bytes = get_dir_size(directory)
print(f"目录总大小: {format_size(size_bytes)}")

​代码优化点​​:

  1. 使用os.scandir()代替os.listdir(),因为它返回的是DirEntry对象,性能更好

  2. 递归处理子目录

  3. 添加了格式化显示大小的功能

​输出示例​​:

目录总大小: 1.23GB

4.3 案例3:文件搜索工具

下面实现一个简单的文件搜索工具,可以按名称搜索文件:

import osdef find_files(directory, pattern):"""在目录中递归搜索匹配pattern的文件:param directory: 搜索根目录:param pattern: 要匹配的文件名模式(不区分大小写):return: 匹配文件的完整路径列表"""matched_files = []for root, dirs, files in os.walk(directory):for filename in files:if pattern.lower() in filename.lower():full_path = os.path.join(root, filename)matched_files.append(full_path)return matched_files# 使用示例
results = find_files("/Users/username/Documents", "report")
for file in results:print(file)

​代码特点​​:

  1. 使用os.walk()递归遍历目录树

  2. 支持不区分大小写的模糊匹配

  3. 返回匹配文件的完整路径

5. 常见问题解答(Q&A)

Q1:os.pathpathlib哪个更好?

​A​​:pathlib是Python 3.4引入的面向对象的路径操作库,相比os.path有以下优势:

  1. 更直观的面向对象接口:

    # os.path风格
    os.path.join(dirname, filename)# pathlib风格
    Path(dirname) / filename
  2. 链式调用更简洁:

    path = Path("/path/to/file.txt")
    path.parent.name  # 获取父目录名
  3. 集成了更多实用方法,如:

    path.read_text()  # 读取文件内容
    path.write_text("content")  # 写入文件

​建议​​:

  • 新项目优先使用pathlib

  • 维护旧代码时保持使用os.path

  • 两者可以互相转换:

    from pathlib import Path
    str_path = str(Path("/path/to/file"))  # Path -> str
    path_obj = Path(os.path.join("a", "b"))  # os.path -> Path

Q2:为什么os.remove()有时会报PermissionError

​A​​:PermissionError通常有以下原因:

  1. 文件被其他程序占用(特别是在Windows上)

  2. 当前用户没有删除权限

  3. 文件设置了只读属性

​解决方案​​:

  1. 检查文件是否被其他程序打开

  2. 修改文件权限或属性:

    # Windows上去除只读属性
    os.chmod(filepath, stat.S_IWRITE)
  3. 使用try-except处理异常:

    try:os.remove(filepath)
    except PermissionError:print("无法删除文件,可能正在被使用")

Q3:如何安全地执行系统命令?

​A​​:os.system()存在安全风险,特别是当命令包含用户输入时。更安全的替代方案:

  1. 使用subprocess.run()

    import subprocess# 安全执行命令
    result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
    print(result.stdout)
  2. 避免直接拼接命令字符串:

    # 危险!可能被注入
    user_input = "file; rm -rf /"
    os.system(f"ls {user_input}")# 安全方式
    subprocess.run(["ls", user_input])
  3. 设置超时防止命令长时间运行:

    try:subprocess.run(["ping", "127.0.0.1"], timeout=10)
    except subprocess.TimeoutExpired:print("命令执行超时")

6. 总结与扩展学习

6.1 核心要点回顾

通过本文的学习,我们掌握了os模块的核心功能:

  1. ​文件和目录操作​​:

    • 创建/删除:os.mkdir(), os.makedirs(), os.remove(), os.rmdir()

    • 遍历目录:os.listdir(), os.scandir(), os.walk()

    • 文件信息:os.stat(), os.path.getsize()

  2. ​路径操作​​:

    • 拼接:os.path.join()

    • 解析:os.path.dirname(), os.path.basename()

    • 检查:os.path.exists(), os.path.isfile()

  3. ​系统交互​​:

    • 环境变量:os.environ

    • 执行命令:os.system()

    • 文件权限:os.chmod()

6.2 最佳实践建议

  1. ​路径处理​​:

    • 永远使用os.path.join()代替字符串拼接

    • 考虑使用pathlib获得更现代的API

  2. ​异常处理​​:

    • 文件操作总是可能失败,添加适当的异常处理

    • 常见异常:FileNotFoundError, PermissionError, IsADirectoryError

  3. ​跨平台兼容​​:

    • 不要假设路径分隔符(Windows用\`,Linux用/`)

    • 不要假设文件大小写(Linux区分,Windows不区分)

6.3 扩展学习推荐

  1. ​进阶模块​​:

    • shutil:高阶文件操作(复制、移动、归档等)

    • glob:文件模式匹配(如*.txt

    • tempfile:安全创建临时文件和目录

  2. ​性能优化​​:

    • 对于大量文件操作,使用os.scandir()代替os.listdir()

    • 考虑使用生成器表达式处理大型目录树

  3. ​安全实践​​:

    • 使用subprocess代替os.system()

    • 处理用户输入时进行严格的验证和转义

6.4 最终建议

os模块是Python开发者必须掌握的核心工具之一。建议读者:

  1. 在自己的项目中实践本文的示例代码

  2. 查阅官方文档了解更详细的功能说明

  3. 遇到问题时,优先考虑使用os模块提供的标准解决方案

通过熟练掌握os模块,你将能够编写出更健壮、更高效的Python程序,轻松应对各种文件系统和操作系统交互需求。希望这篇博客对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95882.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniappx 安卓端本地打包的一些总结

本人之前没用过android studio&#xff0c;因为有打包到安卓端的需求&#xff0c;所以有了这篇文章。下面一些内容不正常工作&#xff0c;也不报错&#xff0c;是很烦的&#xff0c;根本不知道是哪里出了问题。比如对应的aar包没有引入。或者没有注册信息。 在实现过程中我遇到…

AUTOSAR进阶图解==>AUTOSAR_SWS_UDPNetworkManagement

AUTOSAR UDP网络管理详解 基于AUTOSAR标准的UDP网络管理模块架构分析与实现指南目录 1. 概述2. UDP网络管理架构 2.1 整体架构图2.2 架构组件详解 3. UDP网络管理状态机 3.1 状态机图3.2 状态详解 4. UDP网络管理操作序列 4.1 序列图4.2 操作流程详解 5. UDP网络管理配置模型 …

AI搜索引擎下的内容优化新范式:GEO的关键技术解析

摘要&#xff1a; 生成式AI搜索引擎的崛起&#xff0c;催生了GEO&#xff08;Generative Engine Optimization&#xff09;这一新的优化领域。本文将深入剖析GEO背后的关键技术&#xff0c;包括深度语义理解、结构化内容生成、以及AI算法的适配性&#xff0c;旨在为品牌在AI时代…

Java Lambda表达式是什么,怎么用

这种代码是什么&#xff0c;怎么阅读/*** 批量插入** param entityList ignore* param batchSize ignore* return ignore*/Transactional(rollbackFor Exception.class)Overridepublic boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStateme…

集成运算放大器(反向加法,减法)

反向加法电路原理&#xff1a;示波器显示&#xff1a;结论&#xff1a;输出电压-&#xff08;R4/R1*V1R4/R2*V2R4/R3*V3&#xff09;。平衡电阻R4等于R1和R2和R3的并联电压。减法运算电路原理&#xff1a;结论&#xff1a;减法运算电路分为三种不同情况&#xff0c;第一种情况为…

Maven入门到精通

目录 一&#xff0c;Maven概述 1.1介绍 1.2安装 1.3Maven生命周期和插件 1.4Maven的坐标的本地仓库的存储地址 二&#xff0c;依赖管理 2.1依赖管理——依赖范围 2.2依赖管理——添加依赖 获取依赖坐标 依赖添加后的操作 2.3依赖管理——依赖传递 2.4依赖管理——依…

计算机网络 TCP 延迟确认机制

TCP 延迟确认&#xff08;Delayed Acknowledgments&#xff0c;简称 Delayed ACK&#xff09;是 TCP 协议中一项旨在减少网络中小数据包数量、提升传输效率的优化机制。其核心思想是&#xff1a;不立即回复 ACK&#xff0c;而是等待一段时间&#xff08;通常 40ms&#xff09;&…

【visual studio】visual studio配置环境opencv和onnxruntime

下载opencv https://opencv.org/releases/?spma2ty_o01.29997173.0.0.57f4c921RELipW配置环境变量visual studio配置opencv 新建c项目选中文件后右键选择属性添加include文件夹库文件添加lib添加lib文件 将上一步的lib文件夹下的两个文件复制到这里以下两者区别在于&#xff0…

【Java】多线程Thread类

1. 进程与线程进程与线程的基本认识进程&#xff08;Process&#xff09;&#xff1a;进程是程序的一次动态执行过程&#xff0c;它经历了从代码加载、执行、到执行完毕的一个完整过程&#xff1b;同时也是并发执行的程序在执行过程中分配和管理资源的基本单位&#xff0c;竞争…

C/C++复习(四)

一.模版 模版涉及的是泛型编程&#xff0c;即通过编译器去确定类型的编程方式&#xff0c;模版分为&#xff1a;类模板和函数模版&#xff0c;下面我们一一复习&#xff1a; 函数模版&#xff1a; 格式&#xff1a; template<typename T1, typename T2,......,typename Tn&g…

022 基础 IO —— 文件

&#x1f984; 个人主页: 小米里的大麦-CSDN博客 &#x1f38f; 所属专栏: Linux_小米里的大麦的博客-CSDN博客 &#x1f381; GitHub主页: 小米里的大麦的 GitHub ⚙️ 操作环境: Visual Studio 2022 文章目录基础 IO —— C 语言文件 I/O 操作基础前言1. C 语言文件操作函数汇…

MNN LLM Chat iOS 流式输出优化实践

本文介绍了在 iOS 平台上使用 MNN 框架部署大语言模型&#xff08;LLM&#xff09;时&#xff0c;针对聊天应用中文字流式输出卡顿问题的优化实践。通过分析模型输出与 UI 更新不匹配、频繁刷新导致性能瓶颈以及缺乏视觉动画等问题&#xff0c;作者提出了一套包含智能流缓冲、U…

【开发技巧】VS2022+QT5+OpenCV4.10开发环境搭建QT Creator

VS2022编译器支持配置 QT5默认安装以后支持的是VS2015与VS2017&#xff0c;不支持VS2022&#xff0c;所以必须首先在Qt Creator中配置支持VS2022。配置顺序如下&#xff1a; 首先打开【工具】->【选项】 然点击Kits里面的【编译器】选项。点击Manual下面的【C】然后点击【…

【Linux系统】动静态库的制作

前言&#xff1a; 上文我们讲到了文件系统【Linux系统】详解Ext2&#xff0c;文件系统-CSDN博客 本文我们来讲讲动静态库的制作 库 【Linux】编译器gcc/g及其库的详细介绍_linux gcc 有哪些库-CSDN博客 这篇文章的第4大点&#xff0c;简单是介绍了一下库的基本概念。 静态库 静…

链式二叉树的基本操作——遍历

本文笔者将带领读者一起学习链式二叉树的一些基本语法&#xff0c;至于更难一些的插入删除等&#xff0c;笔者将在后续C更新后再次详细带领大家学习。 首先&#xff0c;在进行二叉树之前&#xff0c;我们需要一颗二叉树&#xff0c;而二叉树的初始化现阶段实现不太现实&#x…

Windows运维之以一种访问权限不允许的方式做了一个访问套接字的尝试

一、问题场景 在Windows 上运维服务过程中&#xff0c;经常会遇到运行服务&#xff0c;部署安装时候无任何问题&#xff0c;后续再某个特殊时间点&#xff0c;突然服务无法启动了。再次启动时&#xff0c;提示端口占用与以一种访问权限不允许的方式做了一个访问套接字的尝试。 …

2020/12 JLPT听力原文 问题二 3番

3番&#xff1a;レストランで、女の人と店長が話しています。店長はサラダについて、どんなアドバイスをしていますか。女&#xff1a;店長、この前話してた新しいランチメニューのサラダを作ってみたんですが、どうでしょうか。 男&#xff1a;ああ、サラダだけで満足できるっ…

芯片行业主要厂商

作为一个小白&#xff0c;每次淘宝买芯片时看到相似的命名规则&#xff1a;“OPA、AD、LT、MAX”等等时&#xff0c;我不禁好奇这些芯片行业大厂有哪些&#xff0c;所以查了些资料&#xff1a; 1. 德州仪器&#xff08;Texas Instruments, TI&#xff09; 公司概况&#xff1…

【BLE系列-第四篇】从零剖析L2CAP:信道、Credit流控、指令详解

目录 引言 一、L2CAP主要功能 二、L2CAP帧格式及信道概念 2.1 逻辑链路是什么&#xff1f; 2.2 逻辑信道的作用 2.3 L2CAP帧格式介绍 三、L2CAP信令信道 3.1 信令信道帧格式说明 3.2 信令信道指令介绍 3.2.1 信令信道指令一览表 3.2.2 Credit流控规则 引言 在BLE协…

CSS保持元素宽高比,固定元素宽高比

方法一&#xff1a; <div class"hcp-fixed-aspect-ratio-box">这里是正文内容 </div>.hcp-fixed-aspect-ratio-box {width: 50%;color: #FFFFFF;margin: 100px auto;background: #FF0000;/* 宽高比2:1&#xff0c;兼容性可能不太好 */aspect-ratio: 2 / …