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

news2024/10/9 14:20:15

前言

本文是根据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.coloradmin.cn/o/1863264.html

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

相关文章

python笔记3

1.通过乘法多次打印,以及字符串相加的合体打印 xzzz yyyy print(xy) print(x*10)#与一个数为打印多少次 2.设置俩个变量,可以通过下面的方法来判断是否一个元素是否在另一个元素中,返回bool值 xzzz yyyy print(xy) print(x*10)#与一个数为打…

算法学习笔记——单双链表及其反转—堆栈诠释

单双链表及其反转——堆栈诠释 按值传递 int、long、byte、short、char、float、double、boolean和String 都是按值传递 概念:在方法被调用时,实参通过形参把它的内容副本传入方法内部,此时形参接收到的内容是实参值的一个拷贝,…

Windows 获取打印机及端口号方法 (C#)

1. 打开注册表编辑器 regedit 2.选择如下配置 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Device 3. 代码 C# using System; using Microsoft.Win32;class Program {static void Main(){string registryPath "SOFTWARE\Microsoft\Windows …

解决pycharm安装dlib失败的问题

今天使用pycharm来学习opencv人脸识别库face-recognition的时候出现了一点小问题,在pycharm中直接安装face-recognition会失败,说是因为缺少依赖库dlib,但是直接使用pycharm安装dlib库也有问题,不知道大家遇到没有 错误提示 note…

【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统

最终效果 文章目录 最终效果前言素材下载图片配置获取格子坐标动态控制背包大小添加物品移动物品物品跟随鼠标创建物品的容器,定义不同物品修改物品尺寸修复物品放置位置问题按物品尺寸占用对应大小的格子判断物品是否超出边界范围物品放置重叠,交换物品…

全景图片/老照片/动漫图片一键无损放大与修复

在日常生活中,我们经常使用系统自带的图片处理软件来对图片进行缩放操作,从而实现放大或缩小图片。然而,这种方法会带来一个问题:如果原始图片较小,放大后会导致精度损失,使图片变得模糊。 近年来&#xf…

SD-WAN带宽对使用的影响及如何规划

SD-WAN(软件定义广域网)是一种创新技术,旨在优化和提升企业网络的性能、可靠性和安全性。带宽在SD-WAN的使用中起着关键作用,而确定SD-WAN专线所需的带宽大小需要综合考虑多个因素。本文将深入探讨SD-WAN带宽对使用的影响以及如何…

革新城市景观:轻空间设计团队呈现“淄博会展中心”

“淄博会展中心”,作为国内最大的气膜会展建筑群,自启用以来已经成为淄博市的亮丽新名片和经济引擎。该会展中心在第二十届中国(淄博)国际陶瓷博览会上首次亮相,其独特的设计和先进的建筑理念吸引了广泛关注。今天&…

xxl-job 分布式任务调度 基本使用

xxl-job 是一个分布式任务调度平台,使用非常方便。 官网:https://gitee.com/xuxueli0323/xxl-job 工作原理类似于nacos 执行器注册到调度中心 调度中心分配任务 执行器执行任务 docker-compose 配置 version: 3 services:xxl-job:image: xuxueli/xxl-…

【神经网络】深入理解多层神经网络(深度神经网络

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 深入理解多层神经网络&#x…

【C++题解】1712. 输出满足条件的整数2

问题:1712. 输出满足条件的整数2 类型:简单循环 题目描述: 有这样的三位数,其百位、十位、个位的数字之和为偶数,且百位大于十位,十位大于个位,请输出满所有满足条件的整数。 输入&#xff1…

博客solo!bolo-solo让博客创作更自由。

bolo-solo:独行侠的数字笔录, 你的博客新伙伴- 精选真开源,释放新价值。 概览 bolo-solo是GitHub 上一个开源的个人博客系统:Bolo Solo,简单易部署,自带精致主题、数据统计表、邮件提醒、自定义图床、功能…

利用Linked SQL Server提权

点击星标,即时接收最新推文 本文选自《内网安全攻防:红队之路》 扫描二维码五折购书 利用Linked SQL Server提权 Linked SQL server是一个SQL Server数据库中的对象,它可以连接到另一个SQL Server或非SQL Server数据源(如Oracle&a…

规则引擎-Aviator 表达式校验是否成立

目录 介绍特性使用更多文献支持 介绍 Aviator是一个轻量级、高性能的Java表达式执行引擎,它动态地将表达式编译成字节码并运行。 特性 支持绝大多数运算操作符,包括算术操作符、关系运算符、逻辑操作符、位运算符、正则匹配操作符(~)、三元表达式(?:…

Java学习十一—Java8特性之Stream流

一、Java8新特性简介 2014年3月18日,JDK8发布,提供了Lambda表达式支持、内置Nashorn JavaScript引擎支持、新的时间日期API、彻底移除HotSpot永久代。 ​ Java 8引入了许多令人兴奋的新特性,其中最引人注目的是Lambda表达式和Stream API。以…

【redis】redis概述

1、定义 Redis(Remote Dictionary Server),即远程字典服务,是一个开源的、内存中的数据结构存储系统。redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)…

电脑开机启动项在哪里设置?3个方法教你轻松找到!

“有朋友知道电脑开机启动项在哪里设置吗?我想在里面结束一些程序,但是不知道怎么找到这个功能,请大家帮帮我!” 电脑开机启动项的设置对于优化系统启动速度、管理后台运行程序具有重要意义。通过合理配置启动项,我们可…

《Windows API每日一练》6.2 客户区鼠标消息

第五章已经讲到,Windows只会把键盘消息发送到当前具有输入焦点的窗口。鼠标消息则不同:当鼠标经过窗口或在窗口内被单击,则即使该窗口是非活动窗口或不带输入焦点, 窗口过程还是会收到鼠标消息。Windows定义了 21种鼠标消息。不过…

github无法访问,下载慢的解决方法

GitHub是一个存储分享无数的开源项目和代码的宝库网站。然而,由于一些原因,国内用户在访问GitHub时常常遭遇无法访问或下载速度缓慢的问题。这不仅影响了开发者的工作效率,也使一些想要访问下载github文件的普通用户遇到困难。下面小编就来和…

什么是CMSIS || 标准库与HAL库

一,ARM(Cortex Microcontroller Software Interface Standard) ARM Cortex™ 微控制器软件接口标准(Cortex Microcontroller Software Interface Standard)是 CortexM 处理器系列的与供应商无关的硬件抽象层。…