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)

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

结尾

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【已解决】Python报错:AttributeError: module ‘json‘ has no attribute ‘loads‘

😎 作者介绍:我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun,视频号:AI-行者Sun 🎈 本文专栏:本文收录于《AI实战中的各种bug…

windows安装Nacos并使用

Nacos(前身为阿里巴巴的Nacos Config和Nacos Discovery)是一个开源的动态服务发现、配置和服务管理平台,由阿里巴巴开发并维护。它提供了一种简单且易于使用的方式来管理微服务架构中的服务注册、发现和配置管理。 主要功能包括:…

前端必会--浏览器的工作原理与实践

进程与线程 线程 线程分为单线程和多线程 线程是不能单独存在的,它是由进程来启动和管理的。 进程 一个进程就是一个程序的运行实例。详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的…

k8s使用Endpoint将信息存储到集群外部数据库

https://mp.csdn.net/mp_blog/creation/editor/139864305 上一篇文章

Redis-实战篇-什么是缓存-添加redis缓存

文章目录 1、什么是缓存2、添加商户缓存3、前端接口4、ShopController.java5、ShopServiceImpl.java6、RedisConstants.java7、查看Redis Desktop Manager 1、什么是缓存 缓存就是数据交换的缓冲区(称为Cache),是存贮数据的临时地方&#xff…

找不到d3dcompiler_47.dll如何修复,这几种修复方法可搞定

最近,我在尝试运行一款游戏时遇到了一个问题,系统提示我丢失了d3dcompiler_47.dll文件。这让我感到非常困扰,因为这个问题导致我无法正常运行游戏。经过一番搜索和尝试,我找到了几种修复这个问题的方法,并成功解决了这…

conda如何修改虚拟环境的python版本

有时候安装虚拟环境的时候,忘记指定python的版本,本文介绍一下如何在虚拟环境创建之后,修改python的版本。 1 如果安装了Anaconda Navigator。 2 终端 参考:conda修改当前环境中的python版本_conda更换python版本-CSDN博客

【计算机毕业设计】167校园失物招领微信小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

学习笔记——动态路由——RIP(RIP工作原理/防环机制)

三、RIP工作原理/防环机制 1、工作原理 配置好RIP的路由器会每隔30s,向邻居路由器自动发送RIP路由更新报文。报文里面携带了其所知道的所有路由。 通过发送数据包进行路由信息的交互,路由器启动RIP协议,向周围邻居路由器传递request(请求)response(响…

免费的音频剪辑软件有哪些?分享9个实用的软件,自媒体人必备!

音频剪辑软件能够帮助我们对音视频文件实现个性化剪辑,包括分割、合并、添加音效、转换格式等。那么都有哪些免费好用的音频剪辑软件和方法,本文整理了电脑、手机、在线的音频剪辑方法,能够有效解决音频剪辑的需求,一起来看看吧&a…

深度学习入门2—— 神经网络的组成和3层神经网络的实现

由上一章结尾,我们知道神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数。接下来会介绍神经网络的概要,然后再结合手写数字识别案例进行介绍。 1.神经网络概要 1.1从感知机到神经网 我们可以用图来表示神经网络,我们把最…

云动态摘要 2024-06-25

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新产品更新 Web应用防火墙 - 验证码支持微信小程序接入 阿里云 2024-06-25 支持客户从微信小程序场景下接入,提供人机识别的安全防护。 工业数字模型驱动引擎 - iDME控制台换新升级 华为云…

qt事件和连接TCP协议

QT网络聊天室服务器实现 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this))//给服务器指针实例化一个空间 {ui->setupUi(this); }Widget::~Widget() {d…

⭐最新版!SpringBoot正确集成PageHelper姿势,不再被误导!

GGBond🔈 CSDN的朋友们大家好哇,我是新来的Java练习生 CodeCodeBond! 什么是PageHelper? 这里给不知道的人儿说明一下~~ 知道的xdm可以跳过了! PageHelper顾名思义是一个 页面 帮手。也就是分页查询的一个好用的工具…

vue3前后端开发:响应式对象不能直接成为前后端数据传输的对象

如图所示:前端控制台打印显示数据是没问题的,后端却显示没有接收到相应数据,但是后端的确接收到了一组空数据 直接说原因:这种情况唯一的原因是没有按正确格式传递参数。每个人写错的格式各有不同,我只是说明一下我在…

绝望中迎来曙光,阿里大模型算法岗 Offer 突然来了!

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、算法项目落地经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接如…

3 话题通信-API的使用

目录 (一)常用API 1 初始化 1.1 初始化函数(c++) (1)函数一般表达式: (2)使用 (3)举例(c++) 案例1:argc与argv使用 要求 cmakelists.txt配置 代码 效果图 案例2:options的使用 要求 cmakelists.txt配置 代码 效果图 1.2 初始化函数(python) (…

label studio数据标注平台的自动化标注使用

(作者:陈玓玏) 开源项目,欢迎star哦,https://github.com/tencentmusic/cube-studio 做图文音项目过程中,我们通常会需要进行数据标注。label studio是一个比较好上手的标注平台,可以直接搜…