Python学习笔记19:进阶篇(八)常见标准库使用之glob模块和argparse模块

前言

本文是根据python官方教程中标准库模块的介绍,自己查询资料并整理,编写代码示例做出的学习笔记。

根据模块知识,一次讲解单个或者多个模块的内容。

这里贴一下教程地址:https://docs.python.org/zh-cn/3/tutorial/stdlib.html

官方教程中,可以点击蓝字进入模块信息里面。如下两图示意。

在这里插入图片描述
在这里插入图片描述

文件通配符

glob模块提供了文件名匹配的函数,主要用于查找符合特定规则的文件路径名,类似于shell中的通配符。它可以帮助你根据模式(包含通配符如*, ?, […])搜索文件或目录。

常用函数

  1. glob.glob(pathname, *, recursive=False)
    功能: 返回所有匹配指定模式的文件路径列表。
    参数:
    pathname: 字符串,表示匹配的模式。
    recursive: 可选参数,默认为False。如果为True,则会递归地搜索子目录。
    返回值: 匹配到的文件路径列表。
import glob
import os# 查找当前目录下所有的.py文件
py_file = glob.glob("*.py")
print(py_file)
print("=================分隔符=================")
# 递归查找所有.py文件
all_txt_files = glob.glob("**/*.py", recursive=True)
print(all_txt_files)
print("=================分隔符=================")
# 当前目录是day8,里面就一个py文件,我们用上次学的os的切换目录的方式,切换到x目录去,这个目录文件更丰富
new_path = "E:/python_project/learn_base/x"
os.chdir(new_path)
x_py_file = glob.glob("*.py")
print(x_py_file)
print("=================分隔符=================")
# 递归查找所有.py文件
all_txt_files = glob.glob("**/*.py", recursive=True)
# 使用前面学的for循环打印每个文件的相对路径
for name in all_txt_files:print(name)

在这里插入图片描述

使用glob函数,普通查询和递归查询当前目录下的指定文件。这里查询的是py文件,因为这里面这个文件多,你可以切换到其他目录,试试其他类型的文件。

  1. glob.iglob(pathname, *, recursive=False)
    功能: 类似于glob.glob(),但返回一个可迭代的generator对象,而不是列表。这对于处理大量文件匹配更为高效,因为它不会一次性加载所有结果到内存中。
    参数与glob.glob()相同。
# 使用迭代器查找所有py文件
for py_file in glob.iglob("**/*.py", recursive=True):print(py_file)new_path = "E:/python_project/learn_base/x"
os.chdir(new_path)
print("=================分隔符=================")for py_file in glob.iglob("**/*.py", recursive=True):print(py_file)

在这里插入图片描述

可以看到,两个函数返回的数据打印都一样的,那为什么要两个函数呢?

  1. 返回类型:
    glob.glob(): 直接返回一个列表,其中包含了所有匹配指定模式的文件路径。这意味着它会立即执行查找操作,并将所有结果存储在一个内存中的列表里。对于小规模文件搜索,这很方便直接。但是,如果匹配到的文件数量非常大,这可能会消耗较多内存。
    glob.iglob(): 返回一个迭代器,每次迭代时产生一个匹配的文件路径。这种方式更加内存高效,特别是在处理大量文件时,因为迭代器仅在需要时生成下一个匹配项,而不是一次性加载所有结果。这对于节省资源和处理大型文件系统尤其有用。
  2. 使用场景:
    当你需要立即获得所有匹配项并可以接受其可能带来的内存消耗时,应使用glob.glob()。这适用于匹配结果较少,或者对性能和内存使用没有严格要求的情况。
    如果你关心内存使用效率,特别是当预期匹配到的文件数量巨大时,应该选择glob.iglob()。迭代器允许你在处理每个匹配项的同时进行其他操作,比如逐个读取或处理文件,而无需等待整个列表被构造完成。

因此,提供这两个函数是为了满足不同场景下的需求:一个追求直接性和便捷性(glob.glob()),另一个注重效率和大规模数据处理的能力(glob.iglob())。我们可以根据实际场景选择使用,不过大多时候用glob函数就行,因为一般情况下我们遇不到追求效率和大规模数据处理的场景,但是不用不代表我们不需要知道有这个函数和场景。

命令行参数

argparse模块是用于处理命令行参数的工具。它让编写用户友好的命令行接口变得简单,可以自动生成帮助和使用消息,以及在参数解析错误时给出错误信息。argparse支持各种类型的命令行参数,包括位置参数、可选参数、flag(布尔开关)、值选项等,并且能够处理参数的默认值。

常用函数

  1. ArgumentParser():创建一个ArgumentParser对象,它是命令行解析的基础。

  2. add_argument():向parser中添加一个命令行参数的定义。

  3. parse_args():解析命令行参数,返回一个命名空间对象,其中包含解析后的参数和值。

import argparsedef main():# 创建ArgumentParser对象parser = argparse.ArgumentParser(description="这是一个示例脚本,演示如何使用argparse处理命令行参数。")# 添加一个位置参数parser.add_argument("greeting", help="你要打招呼的内容")# 添加一个可选参数,带有默认值parser.add_argument("-n", "--times", type=int, default=1, help="打招呼的次数,默认为1次")# 添加一个布尔开关parser.add_argument("-v", "--verbose", action="store_true", help="开启详细输出模式")# 解析命令行参数args = parser.parse_args()# 根据参数执行逻辑for _ in range(args.times):if args.verbose:print(f"Verbose mode is on. Saying '{args.greeting}' for the {_ + 1} time.")else:print(args.greeting)if __name__ == "__main__":main()

编写好这些代码,我们就可以去命令行输入命令执行py文件了。

python part_two.py Hello 

在这里插入图片描述
大家简单执行一下命令,看看结果,后面我们会仔细解释,到时候大家就要自己学习怎么写了。

注意看,左下角箭头指向的就是命令行,在IDE里面叫做终端。

看我命令行的第一个箭头,输出以后其实报错了,提示信息是目录文件不存在。因为我执行命令的目录是learn_base目录,实际上我们py文件在/learn_base/x/day8这个目录下,所以下面我使用cd命令进到了day8目录里面执行ls命令查询文件,确定了目标文件在这个目录后,输入执行命令,成功打赢了我们输入的hello。

不确定有没有命令行基础,这里讲两个命令让大家在遇到目录不对的情况切换目录。
cd:cd directory_name 进入目录下,注意如果你不输入全路径,那就是进入当前目录下的目录,目录不存在会报错的
cd … 返回上一层目录
怎么看当前在那一层目录呢? 看你命令行输入的光标,前面的路径就是你当前的目录了
ls: 就直接输就行,查询当前目录的所有文件和目录

命令行的命令太多了,入门又是好几篇文章,我们现在主要学习python,如果遇到需要输入这些命令,我就针对用到的单独讲讲,理解一下知道啥意思就行。

在我们代码里面,我们定义了三个参数,一个必填,两个选填,那么选填这两个参数有什么用呢?

我们根据代码,代码解释和执行情况来看看。

在这里插入图片描述

代码解释

为了让大家理解,我把代码解释贴出来,大家仔细理解,后面也会根据执行情况跟再解释一遍。

  1. 导入argparse模块:首先导入argparse模块,这是处理命令行参数的关键。
  2. 创建ArgumentParser对象:通过argparse.ArgumentParser()创建一个解析器对象,并为其提供一个描述字符串,该字符串会在帮助信息中显示。
  3. 添加位置参数:add_argument(“greeting”, help=“你要打招呼的内容”)定义了一个位置参数greeting,意味着它必须直接跟在脚本名称后面,没有前导短横线。help参数提供了关于此参数的描述,用户可以通过运行脚本加-h或–help查看。
  4. 添加可选参数:add_argument(“-n”, “–times”, type=int, default=1, help=“打招呼的次数,默认为1次”)定义了一个可选参数,可以用短形式-n或长形式–times指定,其类型为整数,并设定了默认值1。这意味着如果不提供这个参数,其值默认为1。
  5. 添加布尔开关:add_argument(“-v”, “–verbose”, action=“store_true”, help=“开启详细输出模式”)定义了一个布尔开关,使用-v或–verbose激活,无须跟随任何值。当这个选项被指定时,其值为True,否则为False。
  6. 解析参数:调用parser.parse_args()解析命令行参数,并将结果存储在args变量中,这是一个命名空间对象,属性对应于各个参数。
  7. 执行逻辑:根据args中的值执行相应的逻辑。这里,根据times的值重复打印greeting,并且如果启用了verbose模式,则额外打印一些调试信息。

第一点就不说了,导入模块,不导入模块的话类使用不了。
第二点:创建解析对象,提供描述字符串,这个字符串是在帮助信息里面的,怎么看帮助信息呢。基本上都可以这么查看。
终端输入命令:

# 两个都行
python part_two.py --help 
python part_two.py -help 

输出内容如图:
在这里插入图片描述
这个帮助信息告诉你哪些内容:

  1. 命令行示例,就是该文件的基本调用语法。part_two.py是脚本的名称,方括号[]内的参数是可选的,而没有方括号的greeting是位置参数,必须提供。
  2. 这个文件的信息,是干嘛用的。
  3. Positional Arguments (位置参数)。在命令行参数解析中,位置参数(Positional Arguments)是指那些必须按照特定顺序出现在命令行上的参数,它们不以破折号(-)或双破折号(–)开头。位置参数的位置决定了它们的含义,而不是通过一个特定的标识符来识别。
    在我们这次的示例中,greeting是唯一的位置参数,用户必须直接在脚本名后面提供一个值,表示想要用于打招呼的具体内容。
  4. Optional Arguments(可选参数),它们通常以破折号开头,可以出现在命令行的任何位置(尽管它们之间以及与位置参数之间的顺序仍然重要)。可选参数提供了额外的灵活性和功能,允许用户选择性地指定参数。
    在这次示例中,我们指定了两个,一个是-n的打招呼次数,一个是-v的布尔值开关,是否打印相信信息。至于-h和–h,这个在python的命令行参数解析中是默认的,不需要我们显示的定义。

帮助内容读完,再回去读代码,是不是一下就搞懂了。

那么我们分别填两个可选参数和一个可选参数试试。

注意可选参数需要破折号+标识符的格式。
在这里插入图片描述

python part_two.py '我是明月望秋思,大家好' -n 3 -v

这个命令是什么意思?位置参数对应的打招呼的信息是:我是明月望秋思,大家好。打招呼次数3次。详细输出开关打开。也就是说执行这个命令,会输出3次详细的打招呼信息。

再看这个命令:

python part_two.py '我是明月望秋思,大家好' -n 3

相比上一个,是不是就是没有打开开关。那么执行这个命令,是不是就只会输出三遍简单的打招呼信息。

参数-n的逻辑,在代码的21行for循环语句
参数-v的逻辑,在代码的22行if条件语句

结尾

今天主要是命令行的内容讲的多一点,要稍微认真学习一下,多看多理解,有理解不了的,可以私信问我,我就当复习了。也可以自己查查资料,做到搞懂为止。

作业

  1. 使用glob函数搜索文件。
  2. 使用argparse模块,构建一个可执行的py文件,设置位置参数和可选参数,并在终端使用命令执行文件。最好不用和我用一个例子,自己构造一个!

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

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

相关文章

应变计在工程中的角色:精准监测与安全保障的得力助手

在工程领域中,应变计作为一种重要的测量工具,扮演着精准监测与安全保障的得力助手的角色。它能够实时、准确地测量物体在受力作用下的变形情况,为工程师提供关键的数据支持,从而确保工程的稳定性与安全性。 应变计在工程中的应用范…

【办公类-51-01】月评估数字生成01-平均数空值

期末需要制作月评估,每月给孩子的能力水平打分。 以前我是做在EXCEL里,手动打分,然后用公式计算1、2、3出现的个数,然后计算平均数,最后复制到Word里。 因为是手动计算,每次都要算很长时间,确保…

基于 NXP LS1046 +FPGA系列 CPCI 架构轨道交通专用板卡

基于 NXP LS1046 系列 CPCI 架构轨道板卡 该产品是一款 CPCI 无风扇架构的高可靠性板卡,CPU 选用 NXP LS1046A 系统平台,支持嵌入式 Linux 或者标准 Ubuntu Linux 、凝思等操作系统,轨道交通 EMC 及宽温级别设计,板载多路 M12 高速…

蓝牙技术|苹果iOS 18的第三方配件将支持AirPods / AirTag的配对体验

苹果公司在 iOS 18 系统中引入了名为 AccessorySetupKit 的新 API,用户不需要进入蓝牙设置和按下按钮,系统就能识别附近的配件,并提示用户进行配对。首次向配件制造商开放这种配对体验。 iPhone 用户升级 iOS 18、iPad 用户升级到 iPadOS 1…

使用 MinIO S3 和 Tailscale VPN 部署应用程序基础设施

在现代 IT 运营中,面向 IT 运营的人工智能 (AI-Ops) 正在通过使用高级算法自动执行任务来改变数据管理。MinIO 和 Tailscale 共同为应用层开发提供了安全、可扩展和有效的基础设施。Tailscale 凭借其基于 WireGuard 的覆盖 VPN 网络&#xff…

【小白专用 已验证24.6.18】C# SqlSugar操作MySQL数据库实现增删改查

【小白专用24.6.18】C# SqlSugar:连接数据库实现简单的,增、删、改、查-CSDN博客 SqlSugar .Net ORM 5.X 官网 、文档、教程 - SqlSugar 5x - .NET果糖网 SqlSugar项目创建 通过NuGet包管理器搜索SqlSugar(MySql还要安装MySql.Data、Newton…

Redis之商品缓存

文章目录 什么是缓存添加Redis缓存缓存更新策略缓存穿透缓存空对象布隆过滤器 缓存雪崩给不同的key的TTL添加随机值利用Redis集群提高服务的可用性给缓存业务添加降级限流策略给业务添加多级缓存 缓存击穿互斥锁逻辑过期 缓存工具封装方法1 写入redis方法2 设置逻辑过期方法3 解…

驱动开发(六):应用层通过文件系统与内核层交互

驱动开发相关文章: 驱动开发(一):驱动代码的基本框架 驱动开发(二):创建字符设备驱动 驱动开发(三):内核层控制硬件层 驱动开发(四)&#xff…

借助TheGraph 查询ENS信息

关于ENS (以太坊域名服务) ENS 全称是 Ethereum Name Service,它是一个建立在以太坊区块链上的去中心化域名系统。 ENS 在 Web3 领域发挥着重要作用,主要有以下几个方面: 可读性更好的地址: ENS 允许用户将复杂的以太坊地址(如 0x12345…) 映射为更简单易记的域名。这极大地提…

中国车牌检测数据集VOC+YOLO格式2001张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2001 标注数量(xml文件个数):2001 标注数量(txt文件个数):2001 标注…

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。 从广义上…

STM32介绍和资料地址

STM32标准外设软件库 https://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.html 支持标准外设库的产品系列:

XMLTomcatHttp协议

XML&Tomcat&Http协议 目录 XML&Tomcat&Http协议 1. xml解析(了解) 1.1 配置文件 1.1.1 配置文件的作用 1.1.2 常见的配置文件类型 1.2 properties文件 1.2.1 文件示例 1.2.2 语法规范 1.3 XML文件 1.3.1 文件示例 1.3.2 概念介绍 1.3.3 XML的基本语…

【Android】记录在自己的AMD处理器无法使用Android studio 虚拟机处理过程

文章目录 问题:无法在AMD平台打开Android studio 虚拟机,已解决平台:AMD 5700g系统:win10专业版1、在 amd平台上使用安卓虚拟机需要安装硬件加速器2、关闭win10上的系统服务 问题:无法在AMD平台打开Android studio 虚拟…

LabVIEW电机故障监测系统

电机作为工业生产中的关键设备,其故障会导致生产停滞和经济损失。因此,开发一个能实时监控电机状态并预测潜在故障的系统具有重要意义。通过高效的数据采集和分析技术,提升故障诊断的准确性和及时性。 系统组成 该系统由以下部分组成&#…

vue3 运用高德地图 自定义弹框 为信息窗体 添加 new AMaps.value.InfoWindow 添加事件

效果图 划过散点的时候出现每个三点位置的数据提示 点击具体散点获取展示信息弹框,并为其添加点击事件 注意点: 1 即使是用的vue,也不能使用click为窗体添加点击事件,需要使用onclick, (原因&#xff1a…

TMC2209驱动模式详解

TMC2209驱动模式详解 1.TMC2209封装2.TMC2209引脚定义 1.TMC2209封装 2.TMC2209引脚定义

JavaWeb系列十五: JavaWeb三大组件之过滤器Filter

老韩-JavaWeb三大组件之过滤器Filter 过滤器说明过滤器基本原理过滤器分析和实例url-patternFilter生命周期FilterConfigFilterConfig应用实例过滤器链基本原理分析过滤链实例演示过滤链注意事项 过滤器作业布置 过滤器说明 过滤器说明 Filter 过滤器是JavaWeb三大组件之一(Se…

Android AOSP 编译并烧录到Google Pixel4XL

简介 AOSP(Android Open Source Project)是Android系统的开源版本,任何人都可以下载、编译和修改。手头上有一台Pixel 4XL,尝试编译AOSP并将其烧录到的设备上。 准备工作 在开始之前,您需要确保您的电脑满足以下条件…

实验08 软件设计模式及应用

目录 实验目的实验内容一、能播放各种声音的软件产品Sound.javaDog.javaViolin.javaSimulator.javaApplication.java运行结果 二、简单工厂模式--女娲造人。Human.javaWhiteHuman.javaYellowHuman.javaBlackHuman.javaHumanFactory.javaNvWa.java运行结果 三、工厂方法模式--女…