注:文末有福利小工具源码
1. 简介
Python 的 os 模块提供了许多接口用于与操作系统进行交互,包括文件操作、目录操作、路径操作、环境变量操作、系统信息获取等。以下是 os 模块中常用的接口及其解释:
- 文件和目录操作:
os.remove(path)
: 删除指定路径的文件。os.rename(src, dst)
: 重命名文件或目录。os.mkdir(path)
: 创建新目录。os.rmdir(path)
: 删除指定目录。os.listdir(path)
: 返回指定目录下的所有文件和目录列表。
- 路径操作:
os.path.join(path1, path2, ...)
:拼接路径。os.path.abspath(path)
: 返回路径的绝对路径表示。os.path.exists(path)
: 判断路径是否存在。os.path.isfile(path)
: 判断路径是否为文件。os.path.isdir(path)
: 判断路径是否为目录。
- 环境变量操作:
os.getenv(key)
: 获取指定环境变量的值。os.putenv(key, value)
: 设置指定环境变量的值。os.environ
: 包含当前环境变量的字典。
- 系统信息:
os.name
: 返回当前操作系统的名称('posix' 或 'nt')。os.uname()
: 返回关于操作系统的信息(仅限 Unix 系统)。os.getlogin()
: 返回当前登录用户名。
- 权限和属性:
os.chmod(path, mode)
: 修改文件或目录的权限。os.stat(path)
: 获取文件或目录的状态信息。os.utime(path, times)
: 修改文件或目录的访问和修改时间。
- 执行系统命令:
os.system(command)
: 在子 shell 中执行系统命令。os.popen(command)
: 执行系统命令并返回一个文件对象。
下面我会针对常用的接口进行代码示例和说明。
2. 基本文件和目录操作
2.1 获取当前工作目录
os.getcwd()
: 返回当前工作目录的绝对路径。
import os current_directory = os.getcwd() print("Current directory:", current_directory)
2.2 创建目录
os.mkdir(path)
: 创建一个新目录。
import os new_dir_path = "new_directory" os.mkdir(new_dir_path)
2.3 判断路径是否是目录
os.path.isdir(path)
: 如果给定路径是目录,则返回True
。
import os path = "some_directory" if os.path.isdir(path): print(f"{path} is a directory.") else: print(f"{path} is not a directory.")
3. 文件操作
3.1 检查文件是否存在
os.path.exists(path)
: 如果指定路径存在,则返回True
。
import os file_path = "file.txt" if os.path.exists(file_path): print(f"{file_path} exists.") else: print(f"{file_path} does not exist.")
3.2 删除文件
os.remove(file_path)
: 删除指定的文件。
import os file_path = "file_to_delete.txt" os.remove(file_path)
3.3 重命名文件
os.rename(src, dst)
: 重命名文件或目录。
import os old_file_name = "old_name.txt" new_file_name = "new_name.txt" os.rename(old_file_name, new_file_name)
4. 高级文件/目录操作
4.1 遍历目录
os.listdir(directory)
: 返回指定目录中的所有文件和子目录名称。
import os directory_path = "some_dir" for item in os.listdir(directory_path): print(item)
4.2 递归遍历目录
- 使用递归函数结合
os.path.join()
进行深度优先搜索。
import os def list_files_recursively(directory): for root, dirs, files in os.walk(directory): for file in files: print(os.path.join(root, file)) list_files_recursively("root_directory")
5. 获取环境变量
通过os.environ
可以获取当前系统的所有环境变量及其对应的取值。
import os # 获取单个环境变量的取值 home_directory = os.environ.get('HOME') print("Home directory:", home_directory) # 获取所有环境变量及其取值 for key, value in os.environ.items(): print(f"{key}: {value}")
6. 设置/修改环境变量
使用os.environ[key] = value
来设置或修改一个环境变量。
import os # 设置新的环境变量 os.environ['MY_VAR'] = 'my_value' # 修改已存在的环境变量 os.environ['PATH'] += ':/new_path' # 保存这些更改 os.putenv('CUSTOM_VAR', 'custom_value') # 可选项,保存更改至OS环境
7. 删除环境变量
可以使用del os.environ[key]
来删除一个环境变量。
import os # 删除特定环境变量 if 'MY_VAR' in os.environ: del os.environ['MY_VAR'] # 保存更改 os.putenv('MY_VAR', '') # 删除 MY_VAR 变量
8.常见面试题
面试题:解释os.path.abspath()
和os.path.realpath()
之间的区别是什么?
答案:
os.path.abspath(path)
函数返回给定路径的绝对路径形式。这意味着它将消除所有符号链接、符号名等,并且将当前工作目录添加到相对路径。
os.path.realpath(path)
函数通过执行实际系统调用来确定给定路径的真实路径。它处理绝对路径和符号链接,然后返回规范化的绝对路径。
实际上,os.path.abspath()
只是将相对路径转换为绝对路径,而os.path.realpath()
则会解析所有符号链接并返回一个指向真实文件的路径。
9.福利小工具
下面是我工作之余整理的一个小工具,包含了常用的文件、文件夹的操作,大家有需要可以直接拿走,开箱即用。
# -*- coding: gbk -*- import os import shutil import traceback class FileLibrary: def copyF2F(self, srcFile, targetFile): ''' 复制一个文件到另一个位置,并重命名 :param srcFile 源文件 :param targetFile 目标文件 :return -1 源文件不存在 ''' ret = False if not os.path.exists(srcFile): ret = False print("【ERROR】文件%s不存在,请检查!" % srcFile) try: shutil.copy(srcFile, targetFile) ret = True print("【INFO】文件:【%s】完成复制, 复制后的文件为:【%s】" % (srcFile, targetFile)) except: ret = False print("【INFO】文件:【%s】复制失败" %(srcFile)) assert ret == True def copyF2D(self, srcFile, targetDir): ''' 复制一个文件到另一个目录下 :param srcFile 源文件 :param targetDir 目标文件夹 :return -1 源文件不存在 ''' ret = False if not os.path.exists(srcFile): print("【ERROR】文件%s不存在,请检查!" % srcFile) ret = False try: if not os.path.exists(targetDir): os.makedirs(targetDir) shutil.copy(srcFile, targetDir) print("【INFO】文件:【%s】完成复制, 复制后的文件为:【%s】" % (srcFile, targetDir)) ret = True except: print("【INFO】文件:【%s】复制失败" % (srcFile)) ret = False assert ret == True def copyD2D(self, srcDir, targetDir): ''' 复制一个文件夹到另一个文件夹中的指定文件夹下 :param srcDir 源文件夹 :param targetDir 目标文件夹 :return -1 源文件不存在 :return -2 源文件不是文件夹 :return -3 目标文件已存在 ''' ret = False if not os.path.exists(srcDir): print("【ERROR】文件%s不存在,请检查!" % srcDir) ret = False if not os.path.isdir(srcDir): print("【ERROR】源文件%s不是文件夹,请检查!" % srcDir) ret = False if os.path.exists(targetDir): print("【ERROR】目标位置%s已存在,请检查!" % targetDir) ret = False try: shutil.copytree(srcDir, targetDir) print("【INFO】文件:【%s】完成复制, 复制后的文件为:【%s】" % (srcDir, targetDir)) ret = True except: print("【INFO】文件:【%s】复制失败" % (srcDir)) print(traceback.format_exc()) ret = False assert ret == True def copyD2DForce(self, srcDir, targetDir): ''' 强制复制一个文件夹到另一个文件夹中的指定文件夹下(覆盖目标文件) :param srcDir 源文件夹 :param targetDir 目标文件夹 :return -1 源文件不存在 :return -2 源文件不是文件夹 ''' ret = False if not os.path.exists(srcDir): print("【ERROR】文件%s不存在,请检查!" % srcDir) ret = False if not os.path.isdir(srcDir): print("【ERROR】源文件%s不是文件夹,请检查!" % srcDir) ret = False try: if os.path.exists(targetDir): print("【INFO】目标位置%s已存在,将覆盖目标位置文件" % targetDir) try: shutil.rmtree(targetDir) except: print("【INFO】目标位置%s已存在,删除失败" % targetDir) ret = False shutil.copytree(srcDir, targetDir) print("【INFO】文件:【%s】完成复制, 复制后的文件为:【%s】" % (srcDir, targetDir)) ret = True except: print("【INFO】文件:【%s】复制失败" % (srcDir)) print(traceback.format_exc()) ret = False assert ret == True def move(self, src, target): ''' 移动一个文件到另一个位置,并重命名(或不重命名) 移动一个文件到另一个文件夹下 移动一个文件夹到另一个文件夹中的指定文件夹下 :param src 源文件、源文件夹 :param target 目标文件、目标文件夹 :return -1 源文件不存在 :return -2 源文件不是文件夹 ''' ret = False if not os.path.exists(src): print("【ERROR】文件%s不存在,请检查!" % src) ret = False if os.path.exists(target): print("【ERROR】目标位置%s已存在,请检查!" % target) ret = False try: shutil.move(src, target) print("【INFO】文件:【%s】完成移动, 移动后的文件为:【%s】" % (src, target)) ret = True except: print("【INFO】文件:【%s】移动失败" % (src)) print(traceback.format_exc()) ret = False assert ret == True def moveForce(self, src, target): ''' 强制移动一个文件到另一个位置,并重命名(或不重命名)(覆盖目标文件) 强制移动一个文件到另一个文件夹下(覆盖目标文件) 强制移动一个文件夹到另一个文件夹中的指定文件夹下(覆盖目标文件) :param src 源文件、源文件夹 :param target 目标文件、目标文件夹 :return -1 源文件不存在 ''' ret = False if not os.path.exists(src): print("【ERROR】文件%s不存在,请检查!" % src) ret = False if os.path.exists(target): print("【INFO】目标位置%s已存在,将覆盖目标位置文件" % target) try: shutil.rmtree(target) except: print("【INFO】目标位置%s已存在,删除失败" % target) ret = False try: shutil.move(src, target) print("【INFO】文件:【%s】完成移动, 移动后的文件为:【%s】" % (src, target)) ret = True except: print("【INFO】文件:【%s】移动失败 " % (src)) print(traceback.format_exc()) ret = False assert ret == True def removeFile(self,filepath): ''' 删除一个文件 :param filepath 要删除的文件路径 ''' ret = False try: if os.path.exists(filepath): os.remove(filepath) print("【INFO】目标文件%s已删除" % filepath) else: print("【ERROR】目标文件%s不存在" % filepath) ret = True except: print("【INFO】目标文件%s删除失败" % filepath) print(traceback.format_exc()) ret = False assert ret == True def removeDir(self,dirpath): ''' 删除一个文件夹 :param dirpath 要删除的文件夹路径 ''' ret = False try: if os.path.exists(dirpath): shutil.rmtree(dirpath) print("【INFO】目标文件夹%s已删除" % dirpath) else: print("【ERROR】目标文件夹%s不存在" % dirpath) ret = True except: print("【INFO】目标文件夹%s删除失败" % dirpath) print(traceback.format_exc()) ret = False assert ret == True def clearDir(self, dirpath): ''' 清空一个文件夹 :param dirpath 要删除的文件夹路径 ''' ret = False try: if os.path.exists(dirpath) and os.path.isdir(dirpath): shutil.rmtree(dirpath) os.mkdir(dirpath) print(f'目标文件夹{dirpath}已清空') else: print(f'目标文件夹{dirpath}不存在') ret = True except: print(f'目标文件夹{dirpath}清空失败') print(traceback.format_exc()) ret = False assert ret == True