Python 的 os 和 shutil 模块

        大家好,在日常的编程工作中,处理文件和目录是一个非常常见的任务。无论是创建、复制、移动还是删除文件,这些操作都需要我们与文件系统进行交互。在 Python 中,有两个强大的模块可以帮助我们轻松地进行文件和目录操作,它们分别是 osshutil 模块。

    os 模块提供了许多用于处理操作系统功能的函数,包括文件和目录操作、环境变量访问等。而 shutil 模块则构建在 os 模块的基础上,提供了更高级的文件操作功能,如复制、移动、删除文件以及归档和压缩等。本文将深入探讨这两个模块的使用方法,并通过示例代码和实用技巧,帮助大家更好地利用 Python 来管理文件系统。

一、介绍

        当探讨 Python 文件系统操作时,osshutil 模块是绕不开的两个关键组件。它们提供了丰富而强大的功能,使得在 Python 中进行文件和目录操作变得更加便捷和高效。下面详细介绍这两个模块的重要性、作用和功能:

1、为什么 os 和 shutil 模块在 Python 编程中如此重要?

        在实际编程中,文件和目录操作是非常常见的任务,涉及到创建、读取、写入、删除、移动、重命名等多种操作。无论是在开发桌面应用、服务器端程序、数据处理脚本还是其他类型的应用中,都会频繁地涉及到文件和目录的操作。而 Python 作为一种流行且功能强大的编程语言,提供了丰富的标准库,其中 osshutil 模块就是处理文件系统操作的重要组成部分。这两个模块的存在,使得开发者能够轻松地在 Python 中执行各种文件和目录操作任务,从而节省了大量的时间和精力。

2、两个模块的作用和功能简介

  • os 模块(Operating System Interface): os 模块提供了与操作系统进行交互的接口,包括文件和目录操作、进程管理、环境变量等。它是 Python 中最常用的标准库之一,提供了许多方便的函数和方法,使得开发者能够轻松地执行各种系统级操作。os 模块的功能包括但不限于:

    • 文件和目录操作:创建、删除、重命名、检查文件是否存在等。
    • 文件信息获取:获取文件大小、修改时间、权限等信息。
    • 目录遍历:遍历目录中的文件和子目录。
    • 环境变量操作:获取、设置、删除环境变量等。
  • shutil 模块(High-level File Operations): shutil 模块是在 os 模块的基础上构建的高级文件操作工具集,提供了一系列用于文件和目录操作的高级函数,如复制、移动、删除文件等。它通过封装底层的系统调用,使得文件操作变得更加简单和安全。shutil 模块的功能包括但不限于:

    • 文件和目录的复制、移动、删除等高级操作。
    • 文件和目录的归档和压缩:支持常见的归档和压缩格式,如 ZIP、tar 等。

二、os 模块

分别详细介绍 os 模块中的这些功能,并提供相应的示例代码:

1、文件和目录操作

        当涉及到文件和目录操作时,os 模块提供了一系列函数来执行各种任务,包括创建、删除、重命名等。下面是对 os 模块中文件和目录操作的详细介绍以及相应的示例代码:

使用 os.mkdir() 函数创建单个目录:

import os

os.mkdir("new_directory")

使用 os.makedirs() 函数创建多级目录:

import os

os.makedirs("new_parent_directory/new_child_directory")

使用 os.rename() 函数重命名文件或目录:

import os

os.rename("old_file.txt", "new_file.txt")
os.rename("old_directory", "new_directory")

使用 os.remove() 函数删除文件:

import os

os.remove("file_to_delete.txt")

使用 os.rmdir() 函数删除空目录:

import os

os.rmdir("empty_directory_to_delete")

使用 os.removedirs() 函数递归删除目录:

import os

os.removedirs("directory_to_delete")

使用 os.path.exists() 函数检查文件或目录是否存在:

import os

if os.path.exists("file_or_directory"):
    print("Exists")
else:
    print("Doesn't exist")

使用 os.listdir() 函数获取指定目录中的文件和子目录列表:

import os

files = os.listdir("directory_path")
print("Files in directory:", files)

使用 os.chdir() 函数改变当前工作目录:

import os

os.chdir("/path/to/new_directory")

使用 os.getcwd() 函数获取当前工作目录:

import os

cwd = os.getcwd()
print("Current working directory:", cwd)

使用 os.path.isfile() 函数检查路径是否为文件:

import os

is_file = os.path.isfile("file_path")
print("Is file:", is_file)

使用 os.path.isdir() 函数检查路径是否为目录:

import os

is_directory = os.path.isdir("directory_path")
print("Is directory:", is_directory)

使用 os.path.split() 函数将路径分割为目录和文件名:

import os

directory, filename = os.path.split("path/to/file.txt")
print("Directory:", directory)
print("Filename:", filename)

使用 os.path.join() 函数连接多个路径部分:

import os

path = os.path.join("directory", "file.txt")
print("Joined path:", path)

获取文件大小:

import os

file_path = 'example.txt'

file_size = os.path.getsize(file_path)
print("文件大小 (字节):", file_size)

获取文件创建时间:

import os
import datetime

file_path = 'example.txt'

create_time = os.path.getctime(file_path)
create_time = datetime.datetime.fromtimestamp(create_time)
print("创建时间:", create_time)

获取文件修改时间:

import os
import datetime

file_path = 'example.txt'

modify_time = os.path.getmtime(file_path)
modify_time = datetime.datetime.fromtimestamp(modify_time)
print("修改时间:", modify_time)

获取文件访问时间:

import os
import datetime

file_path = 'example.txt'

access_time = os.path.getatime(file_path)
access_time = datetime.datetime.fromtimestamp(access_time)
print("访问时间:", access_time)

获取文件名:

import os

file_path = 'example.txt'

file_name = os.path.basename(file_path)
print("文件名:", file_name)

获取文件所在目录路径:

import os

file_path = 'example.txt'

directory = os.path.dirname(file_path)
print("文件所在目录:", directory)

获取文件的绝对路径:

import os

file_path = 'example.txt'

absolute_path = os.path.abspath(file_path)
print("文件的绝对路径:", absolute_path)

3、目录遍历

列出目录下的文件和子目录

import os

for item in os.listdir("directory"):
    print(item)

递归遍历目录下的所有文件和子目录

import os

def list_files(directory):
    for root, dirs, files in os.walk(directory):
        for file in files:
            print(os.path.join(root, file))

list_files("directory")

下面是一个示例,展示如何使用递归来遍历目录中的所有文件和子目录:

import os

def list_files(dir_path):
    # 列出目录中的所有文件和子目录
    files = os.listdir(dir_path)
    
    # 遍历文件和子目录
    for file in files:
        # 构造完整的文件路径
        file_path = os.path.join(dir_path, file)
        
        # 如果是文件,则打印文件路径
        if os.path.isfile(file_path):
            print("文件:", file_path)
        # 如果是目录,则递归调用自身遍历子目录
        elif os.path.isdir(file_path):
            print("目录:", file_path)
            list_files(file_path)

# 要遍历的目录路径
directory_path = 'example_directory'

# 调用函数遍历目录
list_files(directory_path)

        在这个示例中,我们首先使用 os.listdir() 函数列出了指定目录中的所有文件和子目录。然后,我们遍历这些文件和子目录,如果是文件,则打印文件路径;如果是目录,则递归调用 list_files() 函数来遍历该子目录。通过这种方式,我们可以遍历目录中的所有文件和子目录,直到所有子目录都被遍历完毕。 

4、环境变量操作

使用 os.environ.get() 方法可以获取指定环境变量的值。如果环境变量不存在,则返回默认值(可选)。

import os

# 获取指定环境变量的值
value = os.environ.get('PATH')

print("PATH 环境变量的值:", value)

使用 os.environ[] 可以设置或修改环境变量的值。

import os

# 设置或修改环境变量的值
os.environ['MY_VARIABLE'] = 'my_value'

使用 del 关键字可以删除指定的环境变量。

import os

# 删除指定的环境变量
del os.environ['MY_VARIABLE']

使用 os.environ 可以列出所有当前的环境变量。

import os

# 列出所有当前的环境变量
for key, value in os.environ.items():
    print(key, "=", value)

6、权限操作

os.chmod(path, mode): 这个函数用于修改文件或目录的权限。path参数是文件或目录的路径,mode参数是一个数字,代表了新的权限设置。你可以使用stat模块中的常量来指定权限,比如stat.S_IRUSR表示用户可读权限。可以使用位操作符将这些常量组合起来形成所需的权限。

import os
import stat

# 设置文件为用户可读写权限
os.chmod("file.txt", stat.S_IRUSR | stat.S_IWUSR)

os.access(path, mode): 这个函数用于检查指定路径的文件或目录是否具有指定的访问权限。mode参数可以是os.F_OK(检查是否存在)、os.R_OK(检查是否可读)、os.W_OK(检查是否可写)和os.X_OK(检查是否可执行)中的一个或多个组合。 

import os

# 检查文件是否可读
if os.access("file.txt", os.R_OK):
    print("File is readable")
else:
    print("File is not readable")

os.umask(mask): 这个函数用于设置新建文件或目录时的默认权限掩码。权限掩码是一个八进制数,用来掩盖新文件或目录的默认权限。

import os

# 设置新建文件或目录的默认权限掩码为022
os.umask(0o022)

os.stat(path): 这个函数返回一个包含文件或目录的状态信息的命名元组。其中包括文件的权限模式,你可以通过位操作和stat模块中的常量来解析这些权限。

import os
import stat

# 获取文件状态信息
file_stat = os.stat("file.txt")

# 解析文件权限模式
mode = file_stat.st_mode
user_readable = bool(mode & stat.S_IRUSR)
user_writable = bool(mode & stat.S_IWUSR)
user_executable = bool(mode & stat.S_IXUSR)

print("User readable:", user_readable)
print("User writable:", user_writable)
print("User executable:", user_executable)

os.chown(path, uid, gid): 这个函数用于修改文件或目录的所有者和所属组。uid参数是新的用户ID,gid参数是新的组ID。

import os

# 将文件的所有者修改为用户ID为1000,组ID为1000的用户和组
os.chown("file.txt", 1000, 1000)

7、系统信息操作

os.name: 这个属性返回当前操作系统的名称。通常情况下,它返回'posix'表示Linux、Unix或Mac OS X系统,返回'nt'表示Windows系统。

import os

print("Current OS:", os.name)

os.getcwd(): 这个函数用于获取当前工作目录的路径。

import os

# 获取当前工作目录
cwd = os.getcwd()
print("Current working directory:", cwd)

os.getlogin(): 这个函数返回当前登录的用户名。但是在某些平台上,它可能返回空字符串或未实现。

import os

# 获取当前登录的用户名
username = os.getlogin()
print("Current login username:", username)

 os.uname(): 这个函数返回包含系统相关信息的元组,比如操作系统的名称、主机名、内核版本等。但是在Windows系统上,它的返回值和Unix系统有所不同。

import os

# 获取系统信息
system_info = os.uname()
print("System info:", system_info)

os.system(command): 这个函数用于执行系统命令。它会调用操作系统的 shell,并执行指定的命令。执行结果会输出到标准输出,返回命令执行状态码。

import os

# 执行系统命令
os.system("ls -l")

 os.cpu_count(): 这个函数返回当前系统的CPU核心数。

import os

# 获取CPU核心数
cpu_count = os.cpu_count()
print("CPU count:", cpu_count)

os.times(): 这个函数返回当前进程的运行时间信息,包括用户CPU时间和系统CPU时间等。

import os

# 获取进程运行时间信息
process_times = os.times()
print("Process times:", process_times)

os.get_terminal_size(): 这个函数返回当前终端的大小,以行数和列数表示。

import os

# 获取终端大小
terminal_size = os.get_terminal_size()
print("Terminal size:", terminal_size)

8、进程管理

os.fork(): 这个函数在Unix/Linux系统上创建一个子进程。在父进程中返回新创建子进程的进程ID,而在子进程中返回0。使用fork()函数,可以在一个进程中创建一个新的子进程,然后在子进程中执行不同的任务。

import os

# 创建子进程
pid = os.fork()

if pid == 0:
    print("Child process")
else:
    print("Parent process")

os.getpid(): 这个函数返回当前进程的进程ID。

import os

# 获取当前进程ID
pid = os.getpid()
print("Current process ID:", pid)

os.getppid(): 这个函数返回当前进程的父进程的进程ID。

import os

# 获取父进程ID
ppid = os.getppid()
print("Parent process ID:", ppid)

os.exec*(): 这一系列函数可以用于执行外部程序,替换当前进程的内容。它们允许你在Python程序中启动其他程序,类似于使用命令行。这些函数包括os.execl()os.execle()os.execlp()os.execlpe()os.execv()os.execve()os.execvp()os.execvpe()

import os

# 执行外部程序
os.execl('/bin/ls', 'ls', '-l')

os.kill(pid, signal): 这个函数用于向指定进程发送信号。pid参数是目标进程的进程ID,signal参数是要发送的信号。

import os
import signal

# 发送信号给进程
os.kill(12345, signal.SIGTERM)

os.wait(): 这个函数用于等待子进程结束,并返回子进程的状态信息。如果没有子进程在运行,它会抛出OSError异常。

import os

# 等待子进程结束
pid, status = os.wait()
print("Child process", pid, "exited with status", status)

三、shutil 模块

    shutil模块是Python标准库中的一个实用工具模块,用于执行文件和目录的高级操作,例如复制、移动、重命名以及删除文件和目录等。它提供了一些函数来简化这些操作,并处理了一些常见的边界情况,比如处理符号链接、处理异常等。下面是shutil模块中一些常用函数的介绍:

shutil.copy(src, dst, *, follow_symlinks=True): 这个函数用于将文件从源路径src复制到目标路径dst。默认情况下,它会跟踪符号链接并复制链接指向的文件。如果follow_symlinks设置为False,则会复制符号链接本身。 

import shutil

# 将文件从源路径复制到目标路径
shutil.copy("source.txt", "destination.txt")

shutil.copy2(src, dst, *, follow_symlinks=True): 这个函数与shutil.copy()类似,但会尽可能地保留文件的元数据(例如权限、时间戳等)。

import shutil

# 将文件从源路径复制到目标路径,并保留元数据
shutil.copy2("source.txt", "destination.txt")

shutil.move(src, dst, copy_function=copy2): 这个函数用于将文件或目录从源路径src移动到目标路径dst。如果dst已经存在,它会覆盖目标文件或目录。copy_function参数指定了在跨不同文件系统移动时用于复制的函数,默认为shutil.copy2()

import shutil

# 将文件或目录从源路径移动到目标路径
shutil.move("source.txt", "destination.txt")

shutil.rmtree(path, ignore_errors=False, onerror=None): 这个函数用于递归地删除指定路径下的所有文件和子目录。如果ignore_errorsTrue,则会忽略错误,继续删除其他文件和目录。

import shutil

# 递归删除目录及其内容
shutil.rmtree("directory_to_delete")

shutil.rmtree(path, ignore_errors=False, onerror=None): 这个函数用于递归地复制整个目录树。

import shutil

# 递归复制目录及其内容
shutil.copytree("source_directory", "destination_directory")

shutil.make_archive(base_name, format, root_dir=None, base_dir=None): 这个函数用于创建归档文件,例如ZIP或tar文件。base_name是归档文件的名称,format指定了归档格式,root_dir是要归档的根目录,base_dir是要包含在归档中的子目录。

import shutil

# 创建ZIP格式的归档文件
shutil.make_archive("archive", "zip", root_dir="source_directory")

shutil.disk_usage(path): 这个函数用于获取指定路径的磁盘使用情况,返回一个命名元组,包含磁盘总大小、已用大小和可用大小。

import shutil

# 获取指定路径的磁盘使用情况
disk_usage = shutil.disk_usage("/")
print("Total:", disk_usage.total)
print("Used:", disk_usage.used)
print("Free:", disk_usage.free)

shutil.get_archive_formats(): 这个函数返回支持的归档格式的列表,每个格式表示为一个元组,包含格式名称和格式描述。

import shutil

# 获取支持的归档格式
archive_formats = shutil.get_archive_formats()
print("Supported archive formats:", archive_formats)

shutil.register_archive_format(name, function[, extra_args[, description]]): 这个函数用于注册自定义的归档格式。name是归档格式的名称,function是创建归档的函数,extra_args是传递给创建函数的额外参数,description是归档格式的描述。

import shutil

# 注册自定义的归档格式
def create_custom_archive(base_name, root_dir):
    pass

shutil.register_archive_format("custom", create_custom_archive, description="Custom archive format")

shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None): 这个函数用于在系统的 PATH 环境变量中查找可执行文件。如果找到了指定的命令,则返回其完整路径,否则返回None

import shutil

# 查找可执行文件的完整路径
path = shutil.which("python")
print("Python executable path:", path)

shutil.get_terminal_size(fallback=(columns, lines)): 这个函数用于获取当前终端的大小,以列数和行数表示。如果无法获取终端大小,则返回一个备用值。

import shutil

# 获取终端大小
terminal_size = shutil.get_terminal_size()
print("Terminal size:", terminal_size)

shutil.samefile(path1, path2): 这个函数用于检查两个路径是否指向同一个文件或目录。如果是同一个文件或目录,则返回True,否则返回False

import shutil

# 检查两个路径是否指向同一个文件或目录
same_file = shutil.samefile("/path/to/file1", "/path/to/file2")
print("Are the paths the same file:", same_file)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/674295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么判断护眼台灯真的有用吗?揭秘护眼台灯怎么选!

中国目前面临着严重的近视问题,各学段学生的近视率普遍偏高,且高度近视的占比也不容忽视。这不仅对学生的身体健康构成威胁,也对国家的经济社会可持续发展和国家安全构成潜在风险。随着时代的进步和教育的普及,儿童近视的问题已经…

私有仓库搭建

目前市面上比较常见的私有仓库搭建方法为: 通过 Sinopia 或 verdaccio 搭建(Sinopia 已经停止维护,verdaccio 是 Fork 自 Sinopia,基本上大同小异),其优点是搭建简单,不需要其他服务。通过 cnp…

ESP32-C3模组上跑通OTA升级(11)

接前一篇文章:ESP32-C3模组上跑通OTA升级(10) 本文内容参考: 《ESP3-C3 物联网工程开发实战》 乐鑫科技 特此致谢! 上一回说到解决了证书验证的问题,但紧接着又出现了一个新的问题:版本相同无…

分享一款开源可自行托管的 Heroku / Netlify / Vercel 替代方案工具,高达16.9K Star

之前分享了一篇文章【AI云部署】盘点开源项目免费云部署的几种技术方案 , 你可能会有这样的一个想法,要不我自建一个云平台自行托管。你看大公司都是自建的服务,托管在外面有隐私安全顾虑。 Coolify 是 Heroku / Netlify / Vercel 等的开源…

零基础入门学习Python第二阶04SQL详解03

MySQL 新特性 JSON类型 很多开发者在使用关系型数据库做数据持久化的时候,常常感到结构化的存储缺乏灵活性,因为必须事先设计好所有的列以及对应的数据类型。在业务发展和变化的过程中,如果需要修改表结构,这绝对是比较麻烦和难…

PLM系统与PDM系统、ERP系统、CRM系统有哪些关系?

在当今快速发展的信息技术时代,企业信息化已成为提升管理水平和增强竞争力的关键。其中,产品生命周期管理(PLM)作为企业信息化的基石,与其他信息系统如产品数据管理(PDM)、企业资源规划&#xf…

流量卡,你买的是长期套餐的还是短期套餐?

大家可能都知知道,网上的流量卡有两种不同的套餐,长期和短期,那么如果是你的话,你是会选择长期套餐还是短期套餐 在介绍这个问题之前,我们先了解一下什么是长期套餐?什么是短期套餐? 1、长期套…

PS系统教程08

色彩模式 色彩模式我们可能每天都有使用。Photoshop提供了多种颜色模式,每种模式都有其特定的用途和特点。以下是几种常见的颜色模式及其区别。 HSB模式-人眼 点击前景色滑动色相带(0-360度) 颜色色相:颜色相貌(H&a…

【护网急训】应急响应靶场集,24年想参加hvv的同学抓紧练习吧。

应急响应靶场集 网络安全资源分享🔗除了包含技术干货:Java代码审计、web安全、应急响应等,还包含了安全中常见的售前护网案例、售前方案、ppt等,同时也有面向学生的网络安全面试、护网面试等。 护网中最重要的就是通过各类安全设备…

如何自建yum源仓库

文章目录 1,创建可用的yum源文件夹,把你自己的软件包,并放在这个目录文件夹中2,将yum源文件夹目录复制到/var/www/html/中3,客户端修改配置文件4,创建一个 RPM 软件包存储库5,查验是否成功6&…

基于springboot+vue的医院信息管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

软件设计详细需求分析报告-word(直接套用实际文档)

第3章 技术要求 3.1 软件开发要求 第4章 项目建设内容 第5章 系统安全需求 5.1 物理设计安全 5.2 系统安全设计 5.3 网络安全设计 5.4 应用安全设计 5.5 对用户安全管理 5.6 其他信息安全措施 第6章 其他非功能需求 6.1 性能设计 6.2 稳定性设计 6.3 安全性设计 6.4 兼容性设计…

1638. 统计只差一个字符的子串数目

题目 给你两个字符串 s 和 t,请找出 s 中的非空子串的数目,这些子串满足替换一个不同字符以后,是 t 串的子串。换言之,请你找到 s 和 t 串中恰好只有一个字符不同的子字符串对的数目。 一个子字符串是一个字符串中连续的字符。 …

全域外卖加盟是真的还是割韭菜?

近日,被业内公认为是2024年创业风口的全域外卖赛道迎来了第一场危机——多位想做全域外卖服务商的创业者在购买某公司的全域外卖系统后,发现其存在实物与描述严重不符的情况,并在退款阶段遇到诸多阻挠。在此背景下,外界对于全域外…

EPIC Fantasy Village - Low Poly 3D Art(梦幻村庄乡村小镇模型)

这个包提供了一个以幻想为主题的多边形风格游戏,适合TopDown、RPG、冒险、社交和RTS。它允许你创建自己的美丽幻想村庄和角色。 EPIC 幻想村庄包 EPIC幻想村庄包提供了一个以幻想为主题的多边形风格游戏,适用于TopDown、RPG、冒险、社交和RTS游戏。这个包允许你创建自己的美丽…

【Spring Cloud Alibaba】初识Spring Cloud Alibaba

目录 回顾主流的微服务框架Spring Cloud 版本简介Spring Cloud以往的版本发布顺序排列如下: 由停更引发的"升级惨案"哪些Netflix组件被移除了? 替换方案服务注册中心:服务调用:负载均衡:服务降级&#xff1a…

PCB 走线注意事项

PCB 走线注意事项 引言正文 引言 PCB 英文全称 Printed circuit board,中文翻译为印刷电路板。 正文 PCB 板不能直角走线。 直角走线会使传输线的线宽发生变化,造成阻抗的不连续,会引起待高频信号本身的反射,信号在 PCB 中传输…

HarmonyOS NEXT星河版之自定义List下拉刷新与加载更多

文章目录 一、加载更多二、下拉刷新三、小结 一、加载更多 借助List的onReachEnd方法,实现加载更多功能,效果如下: Component export struct HPList {// 数据源Prop dataSource: object[] []// 加载更多是否ingState isLoadingMore: bool…

旋转编码器、DS1302 实时时钟、红外遥控模块、雨滴探测传感器 | 配合Arduino使用案例

旋转编码器 旋转编码器是一种用作检测自动化领域中的角度、速度、长度、位置和加速度的传感器。 有绝对式和增量式,这里使用增量式(相对)。 绝对输出只是周的当前位置,是他们成为角度传感器。增量输出关于轴的运动信息&#xff0…

干货分享 | 详解TSMaster CAN 与 CANFD 的 CRCE2E 校验方法

面对切换工具链的用户来说,在 TSMaster 上完成总线通讯中的 CRC/E2E 校验处理不是特别熟悉,该文章可以协助客户快速使用 TSMaster 完成 CAN/CAN FD 总线通讯的 CRC/E2E 校验。 本文关键字:TSMaster,CAN/CANFD,CRC 校验…