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,一经查实,立即删除!

相关文章

SpringCloud微服务框架的原理及应用详解(九)

本系列文章简介: 随着云计算、大数据和物联网等技术的飞速发展,企业应用系统的规模和复杂度不断增加,传统的单体架构已经难以满足快速迭代、高并发、高可用性等现代业务需求。在这样的背景下,微服务架构应运而生,成为了…

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

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

云网络与云计算:有什么区别?

云计算和云网络是相关但又不同的概念。云计算关注的是应用程序如何运行,而云网络则关注的是应用程序之间的连接如何管理和交付。 云计算 云计算将企业工作负载托管从传统的内部或共置数据中心转移到云服务提供商 ( CSP ) 的数据中心。 云计算提供了三种基本模式&…

智慧公共卫生间系统:科技赋能城市新生活

智慧公共卫生间系统:科技赋能城市新生活 随着城市化进程加速和人们生活水平的提高,公共卫生设施的现代化成为提升城市形象和居民生活质量的重要一环。智慧公共卫生间系统作为其中的重要组成部分,通过引入先进的科技和智能化设备,…

Python中的多继承:深入理解、问题与挑战

Python中的多继承:深入理解、问题与挑战 引言 在面向对象编程中,继承是一个核心概念,它允许我们定义一个类(称为子类或派生类)来继承另一个类(称为父类或基类)的属性和方法。Python支持多继承…

隐藏html5中video标签的控件

1、 隐藏视频控件: 使用video::-webkit-media-controls、video::-moz-media-controls、video::-ms-media-controls等CSS选择器来隐藏不同浏览器上的默认控件。video::part(media-controls)用于覆盖未来的标准,确保最大兼容性。 /* 隐藏所有默认控件 */…

DAY13-力扣刷题

1.组合 77. 组合 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;递归实现组合型枚举 class Solution {List<Integer> temp new ArrayList<Integer>();List<List<Integer>> ans new ArrayList<List<Integer>>();public L…

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

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

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

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

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

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

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

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

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

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

讯飞听见录音笔H1/H1 PRO 如何在录音笔中删除录音

讯飞听见录音笔H1/H1 PRO 如何在录音笔中删除录音 讯飞听见录音笔H1/H1 PRO 如何在录音笔中删除录音 讯飞听见录音笔H1/H1 PRO 如何在录音笔中删除录音 同时按下音量➕和音量➖就可以

大数据处理的坚实基石:Scala不可变数据结构的作用

在大数据处理领域&#xff0c;数据的一致性、可靠性和性能至关重要。Scala语言提供的不可变数据结构在保证数据处理的稳定性和高效性方面发挥着重要作用。本文将详细探讨Scala中不可变数据结构的概念、优势以及它们在大数据处理中的应用。 不可变数据结构的概念 在Scala中&am…

Java零基础-集合:Queue

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

C# —— 继承

C# 面向对象的编程语言: 三个基本特征 1.封装: 例如平时定义一个类 添加属性和方法&#xff0c;属性和方法必须通过指定的对象进行使用&#xff0c;(专业来讲。隐藏对象内部的状态和功能&#xff0c;仅允许通过一组公共函数进行使用) 2.继承: 子类和父类的区分&#xff0c;子…

Redis之商品缓存

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

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

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

Redis数据结构-跳跃表 skiplist

跳跃表&#xff08;Skiplist&#xff09;是一种用于高效查找的概率型数据结构&#xff0c;它在插入、删除、搜索操作上具有较高的性能&#xff0c;接近于平衡树。Redis使用跳跃表来实现有序集合&#xff08;sorted sets&#xff09;中的范围查询。 ### 跳跃表的基本结构 跳跃…

借助TheGraph 查询ENS信息

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