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


目录
相关文章
|
3天前
|
XML 数据格式 Python
Python的`import`用于加载模块,基础形式是`import module`,全量导入
【6月更文挑战第23天】Python的`import`用于加载模块,基础形式是`import module`,全量导入;`from module import name`选择性导入部分,减少命名空间污染;`from module import *`导入所有(不推荐),易引发冲突。别名导入如`from math import sqrt as square_root`可避免冲突。包导入用`.`,如`import xml.etree.ElementTree as ET`。
23 8
|
3天前
|
XML 数据格式 Python
在Python中,导入其他模块是通过使用import语句完成的
在Python中导入模块涉及`import`语句的不同用法:1) `import math`导入整个标准库;2) `from math import sqrt`导入单个函数;3) `import numpy as np`使用别名;4) `from random import *`导入所有(不推荐);5) `import xml.etree.ElementTree as ET`导入子模块;6) 使用`importlib.import_module()`延迟导入;7) `from .module import func`导入相对路径模块,需管理`sys.path`。
24 6
|
2天前
|
算法 数据安全/隐私保护 开发者
Python logger模块详细讲解
Python logger模块详细讲解
10 3
|
3天前
|
Python
Python的`os`模块核心功能概述:通过`os.getcwd()`获取
【6月更文挑战第23天】Python的`os`模块核心功能概述:通过`os.getcwd()`获取、`os.chdir()`改变工作目录;使用`os.mkdir()`, `os.makedirs()`创建目录,`os.rmdir()`, `os.removedirs()`删除;`os.rename()`, `os.renames()`重命名文件或目录;`os.remove()`删除文件;`os.listdir()`列出目录内容;`os.path.exists()`, `os.path.isfile()`, `os.path.isdir()`检查路径;`os.stat()`获取文件属性。
16 4
|
2天前
|
Linux Python
Python- jinja2模块详解
Python- jinja2模块详解
|
1天前
|
JSON Shell API
Python标准库中有哪些好用的模块
在命令行中使用Python标准库模块,如`http.server`、`gzip`、`base64`、`json.tool`和`calendar`,可以直接通过`python -m module_name`调用,无需额外编写代码。例如,`python -m http.server`启动一个简单的HTTP服务器,`python -m gzip -d file.gz`解压缩文件。`json.tool`用于美化显示JSON数据,而`calendar`模块则能输出日历信息。这些在临时需要相关功能时特别方便。
|
2天前
|
程序员 Python
Python--re模块的讲解与应用
Python--re模块的讲解与应用
|
2天前
|
Web App开发 JSON Linux
Python—requests模块全面讲解
Python—requests模块全面讲解
10 0
|
1月前
|
Python 人工智能 数据可视化
Python模块与包(八)
Python模块与包(八)
24 0
Python模块与包(八)
|
1月前
|
Python
python中导入模块/包的几种方式
python中导入模块/包的几种方式
30 0