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 osos.mkdir("new_directory")

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

import osos.makedirs("new_parent_directory/new_child_directory")

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

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

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

import osos.remove("file_to_delete.txt")

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

import osos.rmdir("empty_directory_to_delete")

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

import osos.removedirs("directory_to_delete")

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

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

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

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

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

import osos.chdir("/path/to/new_directory")

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

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

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

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

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

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

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

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

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

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

获取文件大小:

import osfile_path = 'example.txt'file_size = os.path.getsize(file_path)
print("文件大小 (字节):", file_size)

获取文件创建时间:

import os
import datetimefile_path = 'example.txt'create_time = os.path.getctime(file_path)
create_time = datetime.datetime.fromtimestamp(create_time)
print("创建时间:", create_time)

获取文件修改时间:

import os
import datetimefile_path = 'example.txt'modify_time = os.path.getmtime(file_path)
modify_time = datetime.datetime.fromtimestamp(modify_time)
print("修改时间:", modify_time)

获取文件访问时间:

import os
import datetimefile_path = 'example.txt'access_time = os.path.getatime(file_path)
access_time = datetime.datetime.fromtimestamp(access_time)
print("访问时间:", access_time)

获取文件名:

import osfile_path = 'example.txt'file_name = os.path.basename(file_path)
print("文件名:", file_name)

获取文件所在目录路径:

import osfile_path = 'example.txt'directory = os.path.dirname(file_path)
print("文件所在目录:", directory)

获取文件的绝对路径:

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

3、目录遍历

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

import osfor item in os.listdir("directory"):print(item)

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

import osdef 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 osdef 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 osprint("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):passshutil.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)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity协程详解

什么是协程 协程,即Coroutine(协同程序),就是开启一段和主程序异步执行的逻辑处理,什么是异步执行,异步执行是指程序的执行并不是按照从上往下执行。如果我们学过c语言,我们应该知道&#xff0…

ctfshow-web入门-信息搜集(web11-web20)

目录 1、web11 2、web12 3、web13 4、web14 5、web15 6、web16 7、web17 8、web18 9、web19 10、web20 1、web11 域名其实也可以隐藏信息,比如flag.ctfshow.com 就隐藏了一条信息 查询域名的 DNS 记录,类型为 TXT(域名的说明&#…

三天不调休!端午节营销活动规划

今年端午节即将来临,大家将享受到一个三天不调休的小假期。这对各大企业来说,无疑是进行营销的黄金时机。企业可以精心策划和筹备各种具有端午特色的营销活动,吸引广大消费者参与,塑造浓厚的节日氛围,有效提升企业的销…

【Linux】使用 s3fs 挂载 MinIO 桶

s3fs(S3 File System)是一个基于FUSE(Filesystem in Userspace)的用户空间文件系统,可以将Amazon S3存储桶挂载到本地文件系统。通过s3fs,我们可以像操作本地文件一样,对S3存储桶中的数据进行读…

【随笔】Git 实战篇 -- 开心 commit 之后,发现有一处bug还需要改,只能 reset 撤销然后再次提交 -- git reset --(四十三)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

【数据结构】复杂度的重要性—–决定程序运行的效率

【数据结构】复杂度的重要性—–决定程序运行的效率 前言 在我们写算法的时候,常常会需要考虑一个问题:这个算法好不好?而这个“好”实际上就取决于是算法的复杂度。 算法复杂度(Algorithmic Complexity)是指算法在编…

私有仓库搭建

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

代码随想录--哈希表--两数之和

题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums [2, 7, 11, 15], t…

【JAVA SE】抽象类和接口

✨✨欢迎大家来到Celia的博客✨✨ 🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉 所属专栏:JAVA 个人主页:Celias blog~ 目录 引言 一、抽象类 1.1 抽象类的定义 1.2 抽象方法 1.3 抽象…

【vue实战项目】通用管理系统:作业列表

目录 目录 1.前言 2.后端API 3.前端API 4.组件 5.分页 6.封装组件 1.前言 本文是博主前端Vue实战系列中的一篇文章,本系列将会带大家一起从0开始一步步完整的做完一个小项目,让你找到Vue实战的技巧和感觉。 专栏地址: https://blog…

springboot 实现kafka多源配置

文章目录 背景核心配置自动化配置类注册生产者、消费者核心bean到spring配置spring.factoriesyml配置使用 源码仓库 背景 实际开发中,不同的topic可能来自不同的集群,所以就需要配置不同的kafka数据源,基于springboot自动配置的思想&#xf…

Centos 7下的VulFocus靶场搭建详细教程

一、靶场介绍 自带 Flag 功能:每次启动 flag 都会自动更新,明确漏洞是否利用成功。带有计分功能。兼容 Vulhub、Vulapps 中所有漏洞镜像。 二、下载安装 下载 VMware 软件下载 centos镜像 三、Docker知识 学习链接:https://www.runoob.c…

如何在路由器上安装代理服务:详细教程

如何在路由器上安装代理服务:详细教程 步骤一:通过漏洞进入路由器系统开启Telnet服务使用Telnet登录路由器系统查看系统信息和CPU信息步骤二:交叉编译MIPS程序 Go对MIPS的支持 安装TFTP Server使用BusyBox tftp传输文件在路由器系统中下载编译…

linux进程加载和启动过程分析

我们的源代码通过预处理,编译,汇编,链接后形成可执行文件,那么当我们在终端敲下指令$ ./a.out argv1 argv2 后,操作系统是怎么将我们的可执行文件加载并运行的呢? 首先知道,计算机的操作系统的启动程序是写死在硬件上的,每次计算机上电时,都将自动加载启动程序,之后…

四、.Net8对接Ollama实现文字翻译(.Net8+SemanticKernel+Ollama)本地运行自己的大模型

.Net8SemanticKernelOllama 一、Semantic Kernel官方定义SK能做什么? 二、基本使用1、普通对话2、使用插件实现文本翻译功能 三、IChatCompletionService、ITextGenerationService、ITextEmbeddingGenerationService 很多情况都有这样的需求,使用自有系统…

运筹学_5.动态规划

文章目录 引言5.1 动态规划的基本概念首先明确什么是多阶段决策问题 5.2 动态规划的最短路径问题贝尔曼最优化原理建立动态规划模型的步骤 5.3 动态规划的投资分配问题投资分配问题定义投资分配问题的数学模型 5.4 动态规划的背包问题背包问题定义背包问题数学模型 引言 动态规…

Java——二进制原码、反码和补码

一、简要介绍 原码、反码和补码只是三种二进制不同的表示形式,每个二进制数都有这三个形式。 1、原码 原码是将一个数的符号位和数值位分别表示的方法。 最高位为符号位,0表示正,1表示负,其余位表示数值的绝对值。 例如&…

前端JS必用工具【js-tool-big-box】学习,检测密码强度

js-tool-big-box 前端工具库,实用的公共方法越来越多了,这一小节,我们带来的是检测密码强度。 我们在日常开发中,为了便于测试,自己总是想一个简单的密码,赶紧输入。但到了正式环境,我们都应该…

智能售货机的小投入大回报创业机遇

智能售货机的小投入大回报创业机遇 在当今这个快速进化的数字时代,智能售货机作为零售领域的新秀,正以其独特的便捷性和创新性逐步重塑传统零售格局。24小时不间断服务与自动化管理的结合,大幅度削减人力成本,使得智能售货机成为…

电脑突然提示:“failed to load steamui.dll”是什么情况?分享几种解决steamui.dll丢失的方法

相信有一些用户正在面临一个叫做“failed to load steamui.dll”的问题,这种情况多半发生在试图运行某个程序时,系统会提示一条错误消息:“failed to load steamui.dll”。那么,为何steamui.dll文件会丢失,又应该如何解…