【Python深入浅出】Python3中os模块:开启系统交互的万能钥匙

目录

  • 一、引言:os 模块初印象
  • 二、os 模块基础操作
  • 2.1 文件与目录操作
  • 2.1.1 创建操作
  • 2.1.2 读取操作
  • 2.1.3 删除操作
  • 2.1.4 信息获取
  • 2.2 系统信息获取与环境变量管理
  • 2.2.1 系统信息获取
  • 2.2.2 环境变量管理
  • 2.3 进程管理与工作目录操作
  • 2.3.1 进程管理
  • 2.3.2 工作目录操作
  • 三、os 模块使用进阶
  • 3.1 路径处理技巧
  • 3.1.1 路径拼接与分割
  • 3.1.2 路径判断与信息获取
  • 3.2 与其他模块的协同工作
  • 3.2.1 与 sys 模块配合
  • 3.2.2 与 shutil 模块配合
  • 四、os 模块应用实战
  • 4.1 自动化脚本编写
  • 4.2 系统监控与管理
  • 五、总结与展望

  • 一、引言:os 模块初印象

    在 Python 3 的庞大生态系统中,os模块犹如一座桥梁,连接着 Python 程序与底层操作系统,使得我们能够在 Python 代码中轻松实现对操作系统的各种操作。无论是文件和目录的管理,还是环境变量的获取与设置,亦或是系统命令的执行,os模块都提供了简洁而强大的功能接口 。

    想象一下,你需要编写一个 Python 脚本,实现自动创建项目目录结构、根据环境变量配置项目参数以及执行特定系统命令来启动服务等一系列操作。若没有os模块,这些任务将变得异常繁琐,甚至难以实现。而借助os模块,我们只需寥寥数行代码,就能让 Python 程序与操作系统进行高效交互,完成复杂的系统任务。接下来,让我们深入探索os模块的丰富功能与应用场景。

    二、os 模块基础操作

    2.1 文件与目录操作

    2.1.1 创建操作

    在 Python 中使用os模块创建目录十分便捷。若要创建单级目录,可使用os.mkdir()函数,其参数为要创建的目录路径。比如,在当前目录下创建一个名为test_dir的目录,代码如下:

    import os
    os.mkdir('test_dir')
    

    若要创建多级目录,可使用os.makedirs()函数,它能递归地创建所有必要的中间目录。例如,创建一个多级目录parent_dir/sub_dir/sub_sub_dir,代码如下:

    import os
    os.makedirs('parent_dir/sub_dir/sub_sub_dir')
    

    2.1.2 读取操作

    os.listdir()函数用于列出指定目录下的所有文件和子目录,返回一个包含这些名称的列表。若要列出当前目录下的所有内容,代码如下:

    import os
    contents = os.listdir('.')
    print(contents)
    

    若想获取当前工作目录的路径,可使用os.getcwd()函数,示例代码如下:

    import os
    current_dir = os.getcwd()
    print(current_dir)
    

    2.1.3 删除操作

    删除文件时,使用os.remove()函数,参数为要删除的文件路径。例如,删除当前目录下的test.txt文件,代码如下:

    import os
    os.remove('test.txt')
    

    删除单级目录可使用os.rmdir()函数,但该目录必须为空,否则会报错。如删除前面创建的test_dir目录(前提是它为空),代码如下:

    import os
    os.rmdir('test_dir')
    

    若要删除多级目录及其包含的所有内容,可借助shutil模块的shutil.rmtree()函数。比如删除前面创建的parent_dir目录及其所有子目录和文件,代码如下:

    import shutil
    shutil.rmtree('parent_dir')
    

    需要注意的是,使用shutil.rmtree()时要格外小心,因为它会递归删除目录及其所有内容,一旦操作失误,可能导致重要数据丢失。

    2.1.4 信息获取

    使用os.stat()函数可以获取文件或目录的详细信息,该函数返回一个包含各种文件属性的对象。例如,获取当前目录下test.txt文件的信息,代码如下:

    import os
    file_info = os.stat('test.txt')
    print(file_info)
    

    返回的file_info对象包含诸如文件大小(st_size)、最后修改时间(st_mtime)、创建时间(st_ctime)等信息。以文件大小为例,可通过file_info.st_size获取;获取最后修改时间可以使用file_info.st_mtime,得到的是时间戳形式,若要转换为人类可读的时间格式,可借助time模块,示例代码如下:

    import os
    import time
    
    file_info = os.stat('test.txt')
    mtime_timestamp = file_info.st_mtime
    mtime_readable = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(mtime_timestamp))
    print(f"最后修改时间: {mtime_readable}")
    

    2.2 系统信息获取与环境变量管理

    2.2.1 系统信息获取

    获取操作系统类型可通过os.name属性,在 Windows 系统中,它返回’nt’;在 Linux 和 macOS 等 Unix – like 系统中,返回’posix’。示例代码如下:

    import os
    os_type = os.name
    print(os_type)
    

    在 Unix – like 系统中,还可以使用os.uname()函数获取更详细的操作系统信息,包括系统名称、主机名、内核版本等。但该函数在 Windows 系统中不可用。示例代码如下(在 Unix – like 系统中运行):

    import os
    sys_info = os.uname()
    print(sys_info)
    

    2.2.2 环境变量管理

    获取系统所有环境变量,可通过os.environ属性,它返回一个包含所有环境变量的字典。示例代码如下:

    import os
    env_vars = os.environ
    for key, value in env_vars.items():
        print(f"{key}: {value}")
    

    若要获取特定环境变量的值,可使用os.environ.get()方法,例如获取PATH环境变量的值,代码如下:

    import os
    path_var = os.environ.get('PATH')
    print(path_var)
    

    2.3 进程管理与工作目录操作

    2.3.1 进程管理

    在 Python 中,可使用os.system()函数执行系统命令,该函数会直接在系统中执行命令,并返回命令执行的状态码,0 表示执行成功,非 0 表示执行失败。例如,在 Linux 或 macOS 系统中执行ls命令列出当前目录内容,在 Windows 系统中执行dir命令,代码如下:

    import os
    os.system('ls' if os.name == 'posix' else 'dir')
    

    若要执行命令并获取命令的输出结果,可使用os.popen()函数,它返回一个文件对象,通过该对象的read()方法可读取命令的输出。例如,执行ls -l命令并获取其输出,代码如下:

    import os
    output = os.popen('ls -l').read()
    print(output)
    

    os.system()主要用于简单地执行命令,不太关注命令的输出;而os.popen()则更适合需要获取命令执行结果并进行后续处理的场景。

    2.3.2 工作目录操作

    使用os.chdir()函数可以改变当前工作目录,其参数为目标目录的路径。例如,将当前工作目录切换到/home/user/Documents(在 Windows 系统中,路径格式需相应调整),代码如下:

    import os
    os.chdir('/home/user/Documents')
    

    改变工作目录在实际应用中非常有用,比如在处理某个项目的相关文件时,先切换到项目目录,后续对文件的操作就可以使用相对路径,使代码更简洁和可维护。

    三、os 模块使用进阶

    3.1 路径处理技巧

    3.1.1 路径拼接与分割

    在实际编程中,经常需要将不同的路径部分拼接成一个完整的路径,或者将一个完整路径分割成不同的部分。在 Python 中,os.path.join()函数是拼接路径的首选方法 ,它会根据操作系统的规范自动处理路径分隔符,确保路径格式的正确性和跨平台性。例如,要将目录路径/home/user与文件名test.txt拼接成完整路径,代码如下:

    import os
    dir_path = '/home/user'
    file_name = 'test.txt'
    full_path = os.path.join(dir_path, file_name)
    print(full_path)
    

    上述代码在 Unix – like 系统中会输出/home/user/test.txt,在 Windows 系统中会将路径分隔符正确转换为\,输出类似C:\home\user\test.txt(假设C:\home\user为目录路径)。

    若要分割路径,os.path.split()函数可将一个路径分割为目录部分和文件名部分,返回一个包含这两部分的元组。例如,对前面拼接的路径进行分割,代码如下:

    import os
    full_path = '/home/user/test.txt'
    dir_part, file_part = os.path.split(full_path)
    print(f"目录部分: {dir_part}")
    print(f"文件名部分: {file_part}")
    

    此外,os.path.splitext()函数用于分割文件名和扩展名,同样返回一个元组。比如,对于文件test.py,分割代码如下:

    import os
    file_name = 'test.py'
    name_part, ext_part = os.path.splitext(file_name)
    print(f"文件名部分: {name_part}")
    print(f"扩展名部分: {ext_part}")
    

    3.1.2 路径判断与信息获取

    在进行文件操作前,常常需要判断路径是否存在,以避免程序出错。
    os.path.exists()函数可用于判断指定路径是否存在,无论是文件路径还是目录路径都适用。例如,判断/home/user/test.txt文件是否存在,代码如下:

    import os
    path = '/home/user/test.txt'
    if os.path.exists(path):
        print(f"{path} 存在")
    else:
        print(f"{path} 不存在")
    

    若要判断路径是否为文件,可使用os.path.isfile()函数;判断是否为目录则使用os.path.isdir()函数。比如:

    import os
    file_path = '/home/user/test.txt'
    dir_path = '/home/user'
    if os.path.isfile(file_path):
        print(f"{file_path} 是文件")
    if os.path.isdir(dir_path):
        print(f"{dir_path} 是目录")
    

    获取文件的相关信息也是常见需求。os.path.getsize()函数可以获取文件的大小(以字节为单位)。例如,获取test.txt文件的大小,代码如下:

    import os
    file_path = 'test.txt'
    file_size = os.path.getsize(file_path)
    print(f"{file_path} 的大小为: {file_size} 字节")
    

    3.2 与其他模块的协同工作

    3.2.1 与 sys 模块配合

    sys模块主要用于与 Python 解释器进行交互,os模块与sys模块在很多场景下可以协同工作,发挥强大的功能。在获取命令行参数方面,sys.argv列表包含了命令行传递给 Python 脚本的参数,其中sys.argv[0]是脚本名称,后续元素是实际参数。结合os模块,我们可以根据不同的命令行参数执行不同的系统操作。例如,编写一个简单的文件操作脚本,根据命令行参数决定是列出目录内容还是创建目录,代码如下:

    import os
    import sys
    
    if len(sys.argv) < 2:
        print("请提供操作参数,如 'list' 或 'create'")
    else:
        operation = sys.argv[1]
        if operation == 'list':
            dir_content = os.listdir('.')
            print("当前目录内容:")
            for item in dir_content:
                print(item)
        elif operation == 'create':
            if len(sys.argv) < 3:
                print("请提供要创建的目录名")
            else:
                new_dir = sys.argv[2]
                os.makedirs(new_dir, exist_ok=True)
                print(f"{new_dir} 目录已创建")
    

    在程序退出时,sys.exit()函数用于终止 Python 程序的执行,并可以返回一个退出状态码。结合os模块执行系统操作后,可根据操作结果使用sys.exit()返回相应的状态码,方便外部程序判断脚本的执行情况。例如,在执行文件删除操作后,根据删除是否成功返回不同的状态码,代码如下:

    import os
    import sys
    
    file_path = 'test.txt'
    try:
        os.remove(file_path)
        print(f"{file_path} 已成功删除")
        sys.exit(0)  # 正常退出,状态码为0
    except FileNotFoundError:
        print(f"{file_path} 未找到")
        sys.exit(1)  # 异常退出,状态码为1
    

    3.2.2 与 shutil 模块配合

    shutil模块提供了一些高级的文件和目录操作功能,与os模块配合使用,可以完成更复杂的文件管理任务。在文件复制操作中,os模块本身没有直接的文件复制函数,而shutil模块的shutil.copy()函数可以实现文件的复制。例如,将source.txt文件复制到destination.txt,代码如下:

    import shutil
    import os
    
    source_file ='source.txt'
    destination_file = 'destination.txt'
    if os.path.isfile(source_file):
        shutil.copy(source_file, destination_file)
        print(f"{source_file} 已复制到 {destination_file}")
    else:
        print(f"{source_file} 不存在")
    

    对于目录的复制,shutil.copytree()函数可以递归地复制整个目录及其内容。比如,将source_dir目录及其所有子目录和文件复制到destination_dir,代码如下:

    import shutil
    import os
    
    source_dir ='source_dir'
    destination_dir = 'destination_dir'
    if os.path.isdir(source_dir):
        shutil.copytree(source_dir, destination_dir)
        print(f"{source_dir} 已复制到 {destination_dir}")
    else:
        print(f"{source_dir} 不存在")
    

    在文件和目录的移动操作上,shutil.move()函数可以实现移动功能,结合os模块判断源路径和目标路径的有效性,能够确保移动操作的顺利进行。例如,将test.txt文件移动到new_dir目录下,代码如下:

    import shutil
    import os
    
    source_file = 'test.txt'
    destination_dir = 'new_dir'
    if os.path.isfile(source_file) and os.path.isdir(destination_dir):
        destination_path = os.path.join(destination_dir, os.path.basename(source_file))
        shutil.move(source_file, destination_path)
        print(f"{source_file} 已移动到 {destination_path}")
    else:
        print("源文件或目标目录不存在")
    

    四、os 模块应用实战

    4.1 自动化脚本编写

    在日常工作中,我们常常会遇到一些重复性的文件操作任务,如文件备份、批量重命名等。利用 Python 的os模块,我们可以轻松编写自动化脚本,提高工作效率。
    文件备份脚本:假设我们需要定期备份一个重要的项目文件夹,使用os模块结合shutil模块来实现。首先,我们要确定源文件夹和目标备份文件夹的路径。然后,使用os.walk()函数遍历源文件夹及其子文件夹中的所有文件,再利用shutil.copy2()函数将文件复制到目标备份文件夹中,shutil.copy2()函数会保留文件的原始属性,如修改时间、权限等。代码示例如下:

    import os
    import shutil
    import time
    
    # 源文件夹路径
    source_folder = '/path/to/source/folder'
    # 备份文件夹路径,使用当前日期作为备份文件夹的子目录名
    backup_folder = '/path/to/backup/folder/' + time.strftime('%Y%m%d')
    
    # 如果备份文件夹不存在,则创建它
    if not os.path.exists(backup_folder):
        os.makedirs(backup_folder)
    
    for root, dirs, files in os.walk(source_folder):
        for file in files:
            source_file = os.path.join(root, file)
            relative_path = os.path.relpath(source_file, source_folder)
            destination_file = os.path.join(backup_folder, relative_path)
            destination_dir = os.path.dirname(destination_file)
            if not os.path.exists(destination_dir):
                os.makedirs(destination_dir)
            shutil.copy2(source_file, destination_file)
    

    在上述代码中,通过os.walk()函数递归地遍历source_folder目录树,对于每一个文件,先获取其相对路径,然后构建目标备份路径。如果目标路径中的目录不存在,使用os.makedirs()函数创建,最后使用shutil.copy2()函数完成文件的复制备份。

    批量重命名脚本:当我们需要对一个文件夹中的大量文件进行重命名时,手动操作既繁琐又容易出错。借助os模块可以轻松实现批量重命名。例如,将一个文件夹中的所有图片文件按照顺序重新命名,代码如下:

    import os
    
    # 图片文件夹路径
    image_folder = '/path/to/image/folder'
    # 获取文件夹中的所有文件
    files = os.listdir(image_folder)
    
    # 过滤出图片文件(假设只有.jpg格式)
    image_files = [f for f in files if f.endswith('.jpg')]
    
    # 按文件名排序
    image_files.sort()
    
    # 重命名文件
    for i, file_name in enumerate(image_files):
        # 构建新的文件名
        new_name = f'image_{i + 1}.jpg'
        # 构建完整路径
        old_path = os.path.join(image_folder, file_name)
        new_path = os.path.join(image_folder, new_name)
        # 重命名文件
        os.rename(old_path, new_path)
    

    在这段代码中,首先使用os.listdir()函数获取文件夹中的所有文件,然后通过列表推导式过滤出以.jpg结尾的图片文件,并对其进行排序。接着,使用os.rename()函数对每个图片文件进行重命名,新的文件名按照image_序号.jpg的格式生成。

    4.2 系统监控与管理

    os模块不仅在文件操作方面表现出色,还可以用于实现简单的系统监控功能,帮助我们实时了解系统的运行状态,及时发现并解决潜在问题。

    磁盘空间监测:通过os.statvfs()函数可以获取文件系统的状态信息,从而计算出磁盘的总空间、已使用空间和剩余空间。例如,监测系统根目录的磁盘空间使用情况,代码如下:

    import os
    
    disk_info = os.statvfs('/')
    # 总空间,单位为字节
    total_space = disk_info.f_bsize * disk_info.f_blocks
    # 剩余空间,单位为字节
    free_space = disk_info.f_bsize * disk_info.f_bfree
    # 已使用空间,单位为字节
    used_space = total_space - free_space
    
    # 将空间大小转换为GB并保留两位小数
    total_gb = total_space / (1024 ** 3)
    free_gb = free_space / (1024 ** 3)
    used_gb = used_space / (1024 ** 3)
    
    print(f"磁盘总空间: {total_gb:.2f} GB")
    print(f"已使用空间: {used_gb:.2f} GB")
    print(f"剩余空间: {free_gb:.2f} GB")
    

    在上述代码中,os.statvfs(‘/’)获取根目录的文件系统状态信息,f_bsize表示文件系统块大小,f_blocks表示文件系统数据块总数,f_bfree表示可用的数据块数。通过这些信息计算出总空间、剩余空间和已使用空间,并将其转换为 GB 单位进行输出。

    进程状态查看:在 Unix – like 系统中,可以通过遍历/proc目录来查看系统中所有进程的信息。/proc目录是一个虚拟文件系统,它提供了关于系统内核和进程的信息。每个进程在/proc目录下都有一个以其进程 ID(PID)命名的子目录,其中包含了该进程的相关信息,如cmdline文件记录了进程的命令行参数。以下是一个简单的示例,用于列出当前系统中所有进程的 PID 和进程名:

    import os
    
    def get_all_processes():
        processes = []
        for pid in os.listdir('/proc'):
            if pid.isdigit():
                try:
                    with open(f'/proc/{pid}/cmdline', 'rb') as f:
                        cmdline = f.read().decode().replace('\x00', ' ')
                        if cmdline:
                            processes.append((int(pid), cmdline))
                except IOError:
                    continue
        return processes
    
    all_processes = get_all_processes()
    for pid, name in all_processes:
        print(f'PID: {pid} | 进程名: {name}')
    

    在这个脚本中,首先遍历/proc目录下的所有子目录,判断子目录名是否为数字(即是否为有效的 PID)。对于每个有效的 PID,尝试打开其对应的cmdline文件,读取并解码文件内容,去除其中的空字符\x00,将进程的 PID 和进程名添加到processes列表中,最后遍历该列表并打印出每个进程的 PID 和进程名。

    五、总结与展望

    Python 3 的os模块为我们提供了丰富且强大的功能,涵盖了文件与目录操作、系统信息获取、环境变量管理以及进程管理等多个方面,成为 Python 编程中与操作系统交互的重要桥梁。通过os模块,我们可以轻松实现文件和目录的创建、读取、删除、重命名等基础操作,还能获取系统的各类信息,如操作系统类型、当前工作目录、环境变量等,为程序的运行提供必要的上下文信息 。

    在实际应用中,os模块广泛应用于自动化脚本编写、系统监控与管理、数据处理等领域。例如,在自动化脚本编写中,利用os模块可以实现文件的批量处理、目录结构的自动创建与管理,大大提高工作效率;在系统监控方面,通过os模块获取系统资源使用情况、进程状态等信息,有助于及时发现系统问题并进行优化 。

    展望未来,随着计算机技术的不断发展,操作系统的功能日益丰富和复杂,os模块也将不断演进和完善,为开发者提供更便捷、高效的操作系统交互接口。在大数据和人工智能领域,os模块将在数据存储、管理和处理过程中发挥重要作用,帮助开发者更好地管理和操作大规模的数据文件和目录。在云计算和容器化技术中,os模块也将为容器的创建、管理和资源分配提供支持,助力实现高效的云应用部署和管理 。

    对于广大 Python 开发者来说,深入学习和掌握os模块的使用方法,不仅能够提升编程能力,还能为解决实际问题提供更多的思路和方法。希望读者通过本文的介绍,对os模块有更深入的了解和认识,并在实际编程中不断探索和实践,充分发挥os模块的强大功能 。

    作者:奔跑吧邓邓子

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python深入浅出】Python3中os模块:开启系统交互的万能钥匙

    发表回复