Python学习笔记20:进阶篇(九)常见标准库使用之sys模块和re模块

前言

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

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

教程链接:https://docs.python.org/zh-cn/3/tutorial/index.html

错误输出重定向和程序终止

在Python中,没有单独用于错误输出重定向和程序终止的模块,主要是通过sys模块和os模块一起实现。

这里我们先把错误输出重定向和程序终止的功能讲一下,然后再主要讲讲sys模块。

实现功能主要通过下面几个函数:

  1. sys.stdout :标准输出
  2. sys.stderr: 标准错误流
  3. sys.exit([arg]): 终止当前程序,可选地传入一个参数作为退出状态码。默认情况下,0表示成功,非零值通常表示异常终止。当我们调用这个函数的时候,即表示我们需要终止当前程序的运行。这个函数用于指示程序已经成功完成其任务并需要干净、有序地关闭,是程序流程控制中的一个重要手段。
  4. os.dup(fd): 复制指定的文件描述符 fd。几个常见的文件描述符有:0-标准输入(stdin),1-标准输出(stdout),2-标准错误(stderr)
  5. os.dup2(fd1, fd2): 用于复制文件描述符fd1到fd2,常用于重定向输出流。
import sys
import os# 创建或打开一个文件用于错误输出重定向
with open('error.log', 'w') as f:original_stderr_fd = os.dup(2)try:os.dup2(f.fileno(), 2)# 模拟发生错误的情况raise ValueError("这是一个错误示例")except Exception as e:# 显式打印错误信息到重定向后的stderr(即error.log)print(f"捕获到错误: {e}", file=sys.stderr)finally:# 恢复标准错误到初始状态os.dup2(original_stderr_fd, 2)os.close(original_stderr_fd)# 由于使用了with语句,文件会在此自动关闭,但显式调用flush确保数据被立即写入f.flush()# 使用sys.exit终止程序,假设一切正常,使用0作为退出状态码
sys.exit(0)

在这里插入图片描述
执行代码,发现目录下生了一个error.log文件,并且文件被写入了我们手动抛出的错误信息。

在上面的代码中:

  1. 使用w的模式,创建了一个error.log的文件。这个文件后面用来复制文件描述符重定向输出流。

  2. 使用os.dup(2)函数,复制了stderr的文件描述符到变量original_stderr_fd 。注意dup函数的输出的新文件描述符指向与旧文件描述符相同的底层文件,也就是说通过新旧两个文件描述符进行的读写操作会影响同一个文件资源。

  3. 使用os.dup2(fd1,fd2)函数。这个函数执行的结果就是 fd2 被重定向 了,使其 指向了 fd1 当前所指向的文件或资源,并且断开之前指向的资源。这意味着之后对 fd2 的任何读写操作都将作用于原本 fd 指向的文件或资源上。对于代码来说,就是对stderr的读写会复制到error.log文件上。

  4. 手动抛出了一个错误信息,让异常处理模块工作。

  5. 把捕获的错误信息显示的打印到stderr,由于3的存在,信息会复制到error.log文件中。

  6. 使用os.dup2将之前备份的原始标准错误文件描述符original_stderr_fd复制到标准错误文件描述符(2),以恢复标准错误输出。这里要和23一起看。我们先通过2复制出了original_stderr_fd,由于函数dup的特性original_stderr_fd和stderr指向同一个资源,又通过3,把error.log复制给了stderr,由于函数dup2的特性,stderr和original_stderr_fd断开关联,和error.log关联上。最后把original_stderr_fd再通过dup2复制会stderr,这个时候stderr和error.log又断开。而original_stderr_fd原本就是stderr复制出的文件描述符。简单理解为 a=b,b=c,b=a这种操作。

  7. 关闭一些资源

  8. 退出程序,大家可以看到运行输出框中有一行字:进程已结束,退出代码为0。如果你exit函数的参数传1,那么这里展示退出代码为1。

有点难理解,我也懵挺久,感觉后面还得研究研究。觉得头痛可以先跳过吧,有需要用到的时候再仔细专研一下。

字符串模式匹配

re模块(正则表达式模块),是Python中最常用的字符串模式匹配模块。正则表达式是一种强大的文本处理工具,能够进行复杂的字符串匹配和替换操作。

常用函数

  1. re.compile(pattern[, flags]):编译正则表达式模式,创建一个正则表达式对象。
  2. match(pattern, string[, flags]):尝试从字符串的起始位置匹配模式,返回Match对象或None。
  3. search(pattern, string[, flags]):扫描整个字符串,寻找模式的第一个匹配项,返回Match对象或None。
  4. findall(pattern, string[, flags]):返回字符串中所有非重叠匹配项的列表。
  5. sub(pattern, repl, string[, count, flags]):将字符串中匹配到的模式替换为指定的字符串或函数返回值。

使用

import re
# 编译正则表达式
pattern = re.compile(r'\d+')# 使用match方法从字符串开始处匹配数字
match_result = pattern.match('123abc')
if match_result:print("Match found:", match_result.group())
else:print("No match at the start.")# 使用search在整个字符串中查找数字
search_result = pattern.search('abc123def')
if search_result:print("Search found:", search_result.group())# 使用findall找到所有数字
findall_results = pattern.findall('abc123def456ghi')
print("Find all matches:", findall_results)# 使用sub替换匹配到的数字为"number"
sub_result = pattern.sub('number', 'abc123def456ghi')
print("After substitution:", sub_result)

在这里插入图片描述
正则表达式的函数调用没有那么复杂,相对需要学习的是正则表达式的编写,这东西巴拉巴拉又是一大段,但是我们重点不放在这里,就略过了。

结尾

今天主要讲的内容没有特别要注意的地方,因为第一个有点抽象,第二个重点不在于函数的应用。但是还是要认真看看,起码要知道有这个模块,能实现哪些功能,不然真遇到情况了还不知道用啥。

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

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

相关文章

电商平台数据爬取经验分享

一、引言 在电商领域,数据的重要性不言而喻。无论是市场趋势分析、竞争对手研究,还是用户行为洞察,都离不开数据的支持。而数据爬虫作为获取这些数据的重要工具,其技术的掌握和运用对于电商平台来说至关重要。本文将结合个人实际…

AI绘画 Stable Diffusion【实战进阶】:图片的创成式填充,竖图秒变横屏壁纸!想怎么扩就怎么扩!

大家好,我是向阳。 所谓图片的创成式填充,就是基于原有图片进行扩展或延展,在保证图片合理性的同时实现与原图片的高度契合。是目前图像处理中常见应用之一。之前大部分都是通过PS工具来处理的。今天我们来看看在AI绘画工具 Stable Diffusio…

架构师篇-7、企业安全架构设计及实践

摘要: 认识企业安全架构企业安全案例分析及实践 内容: 为什么做企业安全架构怎么做好安全架构设计案例实践分析&随堂练 为什么要做企业安全架构 安全是麻烦制造者? 整天提安全需求增加开发工作增加运维要求增加不确定性延后业务上线…

[C++][设计模式][适配器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件系统中,由于应用环境的变化,常常需要将”一些现存的对象“放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足如何应对这些”迁移的变化“?如何既能利用现…

【单片机毕业设计选题24038】-基于STM32的木材厂环境监测系统

系统功能: 系统上电后根据采集到的传感器值自动控制,温度过高后自动开启风扇通风降温,湿度过 高后自动开启风扇除湿,光照过低后自动开启补光,雨量过高蜂鸣器报警,火焰传感器检 测到火灾后蜂鸣器报警并打开水泵灭火。…

20240629在飞凌的OK3588-C开发板的Linux R4系统下使用i2cdetect确认I2C总线

rootok3588:/# i2cdetect -y -r 0 rootrk3588-buildroot:/# i2cdetect -l rootrk3588-buildroot:/# i2cdetect -F 0 20240629在飞凌的OK3588-C开发板的Linux R4系统下使用i2cdetect确认I2C总线 2024/6/29 15:37 在CAM1、CAM2挂载OV13850。 在CAM3、CAM4和CAM5挂载OV5645了。 in…

Spring-循环依赖是如何解决的

1、bean被创建保存到spring容器的过程 1、实例化 -> 获取对象; 2、填充属性;这里可能需要依赖其它的bean。 3、AOP代理对象替换; 4、加入单例池; 问题: 循环依赖怎么处理 ServiceA 中有属性ServiceB b&#…

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

法一:第一次安装宝塔 第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了 法二:第一种方法没解决用这种 出现mysqli::real_connect(): (HY000/2002): No such file or directory错误通…

【数据结构|C语言版】四大排序(算法)

前言1. 插入排序1.1 直接插入排序1.2 希尔排序 2. 选择排序2.1 选择排序2.2 堆排序 3. 交换排序3.1 冒泡排序冒泡排序的步骤 3.2 快速排序快速排序的步骤 4. 归并排序归并排序的步骤:代码解释:归并排序的性能: 上期回顾: 【数据结构|C语言版】…

kubuadm 方式部署 k8s 集群

准备三台机器 主机名IP地址CPU/内存角色K8S版本Docker版本k8s231192.168.99.2312C4Gmaster1.23.1720.10.24k8s232192.168.99.2322C4Gwoker1.23.1720.10.24k8s233192.168.99.2332C4Gwoker1.23.1720.10.24 需要在K8S集群各节点上面安装docker,如未安装则参考 …

【Linux】已解决:Ubuntu虚拟机安装Java/JDK

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项结论 已解决:Ubuntu虚拟机安装Java/JDK 一、分析问题背景 在Ubuntu虚拟机上安装Java开发工具包(JDK)是许多开发者的常见任务。然而,在…

大语言模型LLM基础:推理/不同模型/量化对显存、推理速度和性能的影响

通过本文,你将了解以下几个方面的内容: 要运行一个LLM需要多少显存?(我的GPU可以运行多大LLM?)不同LLM推理速度如何?量化对显存、推理速度和性能的影响?vLLM、DeepSeed等工具的加速…

巴黎成为欧洲AI中心 大学开始输出AI创始人

来自Dealroom 的数据显示,在欧洲和以色列AI创业公司中,法国的AI创业公司资金最充裕。Mistral、Owkin、Hugging Face等法国企业已经融资23亿美元,比英国、德国AI创业公司都要多。 一名大学生走出校门凭借聪明才智和一个黄金点子成为富豪&#…

Profinet IO从站数据 转EtherCAT项目案例

这里是引用 目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 使用PRONETA软件获取PROFINET IO从站的配置信息 2 5 设置网关采集PROFINETIO从站设备数据 5 6 启动ETHERCAT从站转发采集的数据 8 7 选择槽号和数据地址 9 8 选择子槽号 11 9 案例总结 12 1 案例说明 设置…

黑马程序员——Spring框架——day11——redis基础

目录: Redis入门 Redis简介 【1】为什么学习Redis【2】Redis介绍使用Redis能做什么Redis下载与安装 Redis下载Redis安装 在Linux中安装Redis在Windows中安装RedisRedis服务启动与停止 Linux系统中启动和停止Redis掌握 redis启动服务器redis启动客户端停止redisWind…

黑盒渗透测试技术

知识点:信息收集,漏洞验证,MetaSploit技术,MSF后渗透测试 靶机渗透: 三不知:不知IP,不知用户名,不知密码,只知道获取最高权限是root 靶机渗透通常指的是在网络安全领域…

JavaScript整合SpreadJS业务功能实现案例(附源码)

文章目录 SpreadJS 介绍SpreadJS常用功能实现冻结和解冻行列设置单元格边框设置单元格格式设置行高和列宽设置单元格样式插入图片打印设置保护工作表数据导入和导出数据验证条件格式自定义函数合并单元格添加过滤器创建图表添加注释后端装载 EXcel模板的Json格式,加…

Spark查询当前用户下所有账号的余额,如果当天没有余额则使用最近的余额

在使用Apache Spark进行数据分析时,你可能会处理一个包含用户账户和余额信息的数据集。如果你想要查询当前用户下所有账号的余额,并且如果当天没有余额记录,则使用最近的余额,你可以按照以下步骤进行: 数据准备&#x…

代码随想录--字符串--替换数字

题目 给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumber…

.NET 一款用于入口打点的免杀WebShell

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…