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

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

1. 简介


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

  1. 文件和目录操作

    • os.remove(path): 删除指定路径的文件。
    • os.rename(src, dst): 重命名文件或目录。
    • os.mkdir(path): 创建新目录。
    • os.rmdir(path): 删除指定目录。
    • os.listdir(path): 返回指定目录下的所有文件和目录列表。
  2. 路径操作

    • os.path.join(path1, path2, ...):拼接路径。
    • os.path.abspath(path): 返回路径的绝对路径表示。
    • os.path.exists(path): 判断路径是否存在。
    • os.path.isfile(path): 判断路径是否为文件。
    • os.path.isdir(path): 判断路径是否为目录。
  3. 环境变量操作

    • os.getenv(key): 获取指定环境变量的值。
    • os.putenv(key, value): 设置指定环境变量的值。
    • os.environ: 包含当前环境变量的字典。
  4. 系统信息

    • os.name: 返回当前操作系统的名称('posix' 或 'nt')。
    • os.uname(): 返回关于操作系统的信息(仅限 Unix 系统)。
    • os.getlogin(): 返回当前登录用户名。
  5. 权限和属性

    • os.chmod(path, mode): 修改文件或目录的权限。
    • os.stat(path): 获取文件或目录的状态信息。
    • os.utime(path, times): 修改文件或目录的访问和修改时间。
  6. 执行系统命令

    • 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

 

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旦莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值