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


目录
相关文章
|
1月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
45 4
|
10天前
|
Python
Python Internet 模块
Python Internet 模块。
103 74
|
28天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
105 63
|
29天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
29天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
11天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
40 8
|
11天前
Seaborn 教程-主题(Theme)
Seaborn 教程-主题(Theme)
31 7
|
11天前
|
Python
Seaborn 教程-模板(Context)
Seaborn 教程-模板(Context)
34 4
|
11天前
|
数据可视化 Python
Seaborn 教程
Seaborn 教程
29 5
|
29天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性