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


目录
相关文章
|
4天前
|
数据采集 小程序 数据库
20年“镇国级”IT大牛,竟搞出500页漫画Python零基础顶级教程!
乔布斯说每个人都应该学习一门编程语言。Python正热,我决定通过编程让自己习得一种思考问题的方式,这也是我在个人编程生涯中的最大收获。 我以为只能枯燥无味地学编程,直到看到本书的样章,以漫画形式让我更直观、生动地了解到什么是编程。超级喜欢这种漫画风格。我回想起自己当年学习编程语言时的情景:逼迫自己背诵和消化、吸收那些自己根本没有理解的内容。如果当时有这么一本书,我就不会学得那么艰难,然后用了那么久才摸索成为一名“攻城狮”。
|
6天前
|
Go C# Python
Python 的 shutil 模块
`shutil`是Python标准库中的模块,提供高级文件和目录操作,如复制、移动、重命名、删除以及创建和删除目录。它扩展了`os`模块的功能,支持递归操作,例如`shutil.copytree()`用于递归复制目录,`shutil.rmtree()`用于递归删除目录。`shutil.move()`不仅移动文件,还可用于重命名。`shutil.remove()`和`shutil.rmtree()`分别用于删除文件和目录。这个模块对于文件管理任务非常实用。
|
4天前
|
Python
Python线程是操作系统能够进行运算的最小单位
【7月更文挑战第18天】Python线程是操作系统能够进行运算的最小单位
5 1
|
7天前
|
缓存 数据库连接 API
Python模块如何影响代码的可读性?
【7月更文挑战第15天】Python模块如何影响代码的可读性?
11 3
|
7天前
|
并行计算 大数据 编译器
Python模块如何影响性能?
【7月更文挑战第15天】Python模块如何影响性能?
4 1
|
7天前
|
数据采集 程序员 开发者
Python模块
【7月更文挑战第15天】Python模块
4 1
|
7天前
|
关系型数据库 数据处理 数据库
Python中的异步编程:理解asyncio模块及其应用
在现代编程中,异步编程变得越来越重要。Python中的asyncio模块为开发者提供了强大的工具,帮助他们利用异步编程模式来处理高并发和IO密集型任务。本文将深入探讨asyncio模块的核心概念、基本用法以及实际应用场景,帮助读者更好地理解和运用Python中的异步编程技术。
|
8天前
|
资源调度 计算机视觉 Python
`scipy.ndimage`是SciPy库中的一个子模块,它提供了许多用于处理n维数组(通常是图像)的函数。
`scipy.ndimage`是SciPy库中的一个子模块,它提供了许多用于处理n维数组(通常是图像)的函数。
|
8天前
|
Python
`scipy.signal`模块是SciPy库中的一个子模块,它提供了信号处理、滤波、频谱分析等功能。这个模块包含了许多用于信号处理的函数和类,其中`butter()`和`filtfilt()`是两个常用的函数。
`scipy.signal`模块是SciPy库中的一个子模块,它提供了信号处理、滤波、频谱分析等功能。这个模块包含了许多用于信号处理的函数和类,其中`butter()`和`filtfilt()`是两个常用的函数。
|
8天前
|
数据可视化 Python
时间序列分析是一种统计方法,用于分析随时间变化的数据序列。在金融、经济学、气象学等领域,时间序列分析被广泛用于预测未来趋势、检测异常值、理解周期性模式等。在Python中,`statsmodels`模块是一个强大的工具,用于执行各种时间序列分析任务。
时间序列分析是一种统计方法,用于分析随时间变化的数据序列。在金融、经济学、气象学等领域,时间序列分析被广泛用于预测未来趋势、检测异常值、理解周期性模式等。在Python中,`statsmodels`模块是一个强大的工具,用于执行各种时间序列分析任务。