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

news2024/11/13 8:00:56

前言

本文是根据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 argparse


def 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.coloradmin.cn/o/1860392.html

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

相关文章

执行shell脚本出现 $‘ \r‘ 符号导致执行失败【解决】

👨‍🎓博主简介 🏅CSDN博客专家   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入&#xff01…

mprpc框架基础类的设计

目录 1.回顾 2.主函数书写 3.框架设计 3.1 mprpcapplication.h 3.2 rpcprovider.h 3.3 mprpcapplication.cc 3.4 mprpcprovider.cc 1.回顾 mprpc框架怎么用? 在上一节,我们完成了如何把本地服务发布成RPC服务。 我们打开example下callee下的users…

制造业ERP五大生产模式详解!

制造业面临着从成本控制、生产效率到供应链管理的挑战,每一个环节都需要精细化的管理和高效的协同。而ERP系统,作为一种集信息技术与管理思想于一体的管理工具,正逐渐成为制造业转型升级的关键。那么,通过本文你将会了解到&#x…

某某商场对账返款单,table

好久不写原生html&#xff0c;今天写了个&#xff0c;快忘完了 。。。 Double Header Table ***商场统一收银结算商户对账返款单 商场&#xff08;盖章有效&#xff09; 铺位名称&#xff1a; 铺位号&#xff1a; 制单人&#xff1a; 制单日期&#xff1a; </tr><tr&…

智慧社区:居民幸福生活的保底线,价值非常大。

大屏应该能够显示社区内的关键数据&#xff0c;如人流量、车辆数量、垃圾分类情况等。这些数据可以通过图表、数字、地图等形式展示&#xff0c;以便居民和管理者能够直观地了解社区的情况。 智慧社区可视化大屏成为一个有益于社区管理和居民生活的工具&#xff0c;提供实时、准…

北京互动阅读app开发,“身”临其境,阅读精彩

随着大数据与智能化的不断发展进步&#xff0c;线上阅读软件也越来越多&#xff0c;为了缓解对传统翻页阅读方式产生的疲劳&#xff0c;人们对线上阅读提出了新的要求。对此&#xff0c;与智能科技相结合的北京互动阅读app开发&#xff0c;以高互动、高体验感的优势&#xff0c…

Casaos之qittorrent设置(没有账号密码)

点击安装只有没有账号密码&#xff0c;只能从运行日志中找密码&#xff1a; # 查看container docker ps -a # 查看container日志 docker logs ae15cb90afbd 进入系统 最下方&#xff0c;保存。

solidity智能合约如何实现跨合约调用函数

背景 比如现在有一个需求、我需要通过外部合约获取BRC20 token的总交易量。那么我需要在brc20的转账函数里面做一些调整&#xff0c;主要是两个函数内统计转移量。然后再提供外部获取函数。 /*** dev Sets amount as the allowance of spender over the callers tokens.** Ret…

从SRE视角透视DevOps的构建精髓

SRE 侧重系统稳定性&#xff0c;DevOps 强调开发运维协作。SRE 实践助力DevOps&#xff0c;提升系统稳定性与团队协作效率。 SRE 运用软件工程的原理&#xff0c;将系统管理员的手工任务自动化&#xff0c;负责运维由系统组件构成的服务&#xff0c;确保服务稳定运行。SRE职责涵…

全国计算机等级考试WPS如何报名

全国计算机等级考试WPS如何报名&#xff1f; 注册并登录 全国计算机等级考试官网选择 考试服务-在线报名选择报考省份-开始报名

现成!小众且创新idea! 小样本+故障识别!1DGAN-SVM 批量生成样本-故障识别一体化程序!MATLAB程序,直接运行!

推荐平台&#xff1a;Matlab2022版及以上 在机器学习、深度学习领域&#xff0c;数据的多样性和数量直接影响模型的性能。生成对抗算法GAN&#xff08;Generative Adversarial Network&#xff09;通过对抗过程训练&#xff0c;能够生成高度逼真的数据样本&#xff0c;增加训练…

Verifieable FHE(VFHE):使用Plonky2来证明Zama TFHE的“Bootstrapping的正确执行”

1. 引言 Zama团队2024年论文Towards Verifiable FHE in Practice: Proving Correct Execution of TFHE’s Bootstrapping using plonky2 中&#xff1a; 首次阐述了&#xff0c;在实践中&#xff0c;将整个FHE bootstrapping操作&#xff0c;使用SNARK来证明。在其相应的http…

买卖的价差与速率之间建立的关系

import numpy as np import matplotlib.pyplot as plt# 参数设置 A 100 delta_ba np.array([1, 5, 10]) # 时间差&#xff0c;以秒为单位 k_values [0.05, 0.1, 0.01] # 不同的k值# 计算不同k值下的λb,a def calculate_lambda(A, k, delta):return A * np.exp(-k * delta…

NSSCTF-Web题目16

目录 [GDOUCTF 2023]受不了一点 1、题目 2、知识点 3、思路 [UUCTF 2022 新生赛]ez_upload 1、题目 2、知识点 3、思路 [GDOUCTF 2023]受不了一点 1、题目 2、知识点 php代码审计、数组绕过、弱比较绕过 3、思路 打开题目&#xff0c;出现代码&#xff0c;我们进行代…

AIGC已经火了好几年,现在学还抓得住这个风口吗?

简介 进入人工智能&#xff08;AI&#xff09;与游戏行业整合&#xff08;AIGC&#xff09;领域需要考虑当前的市场需求和行业发展阶段&#xff1a; 1、市场需求&#xff1a;目前&#xff0c;人工智能和游戏行业都在不断发展壮大&#xff0c;并且两者的结合也逐渐成为一个热门领…

当前周周报自动生成工具

周报自动生成工具使用指南 功能简介 每次只用在xx周报.xlsx 中进行工作内容的更改&#xff0c;然后写完之后点一下run\_clear\_formulas\_and\_save.bat就能导出一份当前周周报&#xff0c;不用进行每周都自己新建一份然后把所有需要改时间的地方都改一遍这种重复劳动。 自动…

C++三大特性之一:多态

一、多态 1、通过指针创建对象&#xff08;动态分配&#xff09; #include <iostream> using namespace std;class Base { public:virtual void show() {cout << "Base class show" << endl;} };class Derived : public Base { public:void show…

Android 13 修改系统导航默认值

Android 13 原生系统上&#xff0c;设置-系统-手势-系统导航 菜单&#xff0c;可以修改系统导航方式。 手势导航&#xff1a; 三按钮导航&#xff1a; adb 获取当前导航方式&#xff0c;手势导航 是 2 &#xff0c;三按钮导航是 0 。 settings get secure navigation_mode 修…

游戏AI的创造思路-技术基础-深度学习(2)

感觉坑越挖越大&#xff0c;慢慢填~~~~ 继续上篇进行填坑&#xff0c;这一篇我们介绍下循环神经网络 目录 3.2. 循环神经网络&#xff08;RNN&#xff09; 3.2.1. 算法形成过程 3.2.2. 运行原理 3.2.3. RNN有哪些优缺点 3.2.4. RNN参数 3.2.5. 如何选择RNN模型参数 3.2…

odoo17 tree视图添加按钮

需求描述 点击下图中tree视图上的同步退货单按钮&#xff0c;弹出相应的form视图进行退货单同步&#xff0c;然后点击同步按钮调用后端python代码处理。 实现步骤 主要文件目录结构 js文件的创建 /** odoo-module **/ import { registry } from "web/core/registry&quo…