Python教程:开箱即用的Python os模块知识

简介: 注:文末有福利小工具源码Python 的 os 模块提供了许多接口用于与操作系统进行交互,包括文件操作、目录操作、路径操作、环境变量操作、系统信息获取等

 注:文末有福利小工具源码

1. 简介


Python 的 os 模块提供了许多接口用于与操作系统进行交互,包括文件操作、目录操作、路径操作、环境变量操作、系统信息获取等。以下是 os 模块中常用的接口及其解释:

  1. 文件和目录操作
  • os.remove(path): 删除指定路径的文件。
  • os.rename(src, dst): 重命名文件或目录。
  • os.mkdir(path): 创建新目录。
  • os.rmdir(path): 删除指定目录。
  • os.listdir(path): 返回指定目录下的所有文件和目录列表。
  1. 路径操作
  • os.path.join(path1, path2, ...):拼接路径。
  • os.path.abspath(path): 返回路径的绝对路径表示。
  • os.path.exists(path): 判断路径是否存在。
  • os.path.isfile(path): 判断路径是否为文件。
  • os.path.isdir(path): 判断路径是否为目录。
  1. 环境变量操作
  • os.getenv(key): 获取指定环境变量的值。
  • os.putenv(key, value): 设置指定环境变量的值。
  • os.environ: 包含当前环境变量的字典。
  1. 系统信息
  • os.name: 返回当前操作系统的名称('posix' 或 'nt')。
  • os.uname(): 返回关于操作系统的信息(仅限 Unix 系统)。
  • os.getlogin(): 返回当前登录用户名。
  1. 权限和属性
  • os.chmod(path, mode): 修改文件或目录的权限。
  • os.stat(path): 获取文件或目录的状态信息。
  • os.utime(path, times): 修改文件或目录的访问和修改时间。
  1. 执行系统命令
  • os.system(command): 在子 shell 中执行系统命令。
  • os.popen(command): 执行系统命令并返回一个文件对象。

下面我会针对常用的接口进行代码示例和说明。

2. 基本文件和目录操作


2.1 获取当前工作目录

  • os.getcwd(): 返回当前工作目录的绝对路径。
import os
current_directory = os.getcwd()
print("Current directory:", current_directory)

image.gif

2.2 创建目录

  • os.mkdir(path): 创建一个新目录。
import os
new_dir_path = "new_directory"
os.mkdir(new_dir_path)

image.gif

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.")

image.gif

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.")

image.gif

3.2 删除文件

  • os.remove(file_path): 删除指定的文件。
import os
file_path = "file_to_delete.txt"
os.remove(file_path)

image.gif

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)

image.gif

4. 高级文件/目录操作


4.1 遍历目录

  • os.listdir(directory): 返回指定目录中的所有文件和子目录名称。
import os
directory_path = "some_dir"
for item in os.listdir(directory_path):
    print(item)

image.gif

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")

image.gif

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}")

image.gif

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环境

image.gif

7. 删除环境变量


可以使用del os.environ[key]来删除一个环境变量。

import os
# 删除特定环境变量
if 'MY_VAR' in os.environ:
    del os.environ['MY_VAR']
# 保存更改
os.putenv('MY_VAR', '')  # 删除 MY_VAR 变量

image.gif

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

image.gif


目录
相关文章
|
6天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
19 5
|
16天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
19天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
62 5
|
20天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
17 1
|
21天前
|
XML 前端开发 数据格式
超级详细的python中bs4模块详解
Beautiful Soup 是一个用于从网页中抓取数据的 Python 库,提供了简单易用的函数来处理导航、搜索和修改分析树。支持多种解析器,如 Python 标准库中的 HTML 解析器和更强大的 lxml 解析器。通过简单的代码即可实现复杂的数据抓取任务。本文介绍了 Beautiful Soup 的安装、基本使用、对象类型、文档树遍历和搜索方法,以及 CSS 选择器的使用。
52 1
|
18天前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
15 0
|
19天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
15 0
|
19天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy教程之SciPy模块列表15:单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。功率单位以瓦特(W)表示,1W=1J/s。示例代码展示了如何使用`constants`模块获取马力(hp)的值,结果为745.6998715822701。
16 0
|
20天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy 教程之 SciPy 模块列表 13 - 单位类型。常量模块包含多种单位:公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例:`constants.zero_Celsius` 返回 273.15 开尔文,`constants.degree_Fahrenheit` 返回 0.5555555555555556。
14 0
|
21天前
|
Python
SciPy 教程 之 SciPy 模块列表 11
SciPy教程之SciPy模块列表11:单位类型。常量模块包含公制单位、质量单位、角度换算、时间单位、长度单位、压强单位、体积单位、速度单位、温度单位、能量单位、功率单位、力学单位等。体积单位示例展示了不同体积单位的换算,如升、加仑、流体盎司、桶等。
16 0