Python武器库开发-基础篇(四)

news2024/11/20 11:21:57

基础篇(四)

Open 文件

Python open() 方法用于打开一个文件,并返回文件对象。

在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

Python具有内置函数open()来打开文件。此函数返回文件对象,也称为句柄,因为它用于相应地读取或修改文件。

f = open("test.txt")    # 打开当前目录中的文件
f = open("C:/Python33/README.txt")  # 指定完整路径

Close 文件

完成对文件的操作后,我们需要正确关闭文件。

关闭文件将释放与该文件绑定的资源,并且使用close()方法完成 。

Python有一个垃圾收集器来清理未引用的对象,但是,我们绝对不能依靠它来关闭文件。

f = open("test.txt",encoding = 'utf-8')
# 执行文件操作
f.close()

这种方法并不完全安全。如果对文件执行某些操作时发生异常,则代码将退出而不关闭文件。

一种更安全的方法是使用 try … finally 块。

try:
   f = open("test.txt",encoding = 'utf-8')
   # 执行文件操作
finally:
   f.close()

这样,我们可以保证即使引发异常也可以正确关闭文件,从而导致程序流停止。

最好的方法是使用with语句。这样可以确保在with退出内部块时关闭文件。

我们不需要显式调用该close()方法。它是在内部完成的。

with open("test.txt",encoding = 'utf-8') as f:
   # 执行文件操作

从文件中读取数据

文本文件可存储的数据量多得难以置信:天气数据、交通数据、社会经济数据、文学作品等。每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。例如,你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示这些内容。

要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

要读取文件,需要一个包含几行文本的文件。下面首先来创建一个文件,它包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行:

pi_digits.txt

3.1415926535
  8979323846
  2643383279

下面的程序打开并读取这个文件,再将其内容显示到屏幕上:

file_reader.py

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents)

在这个程序中,第1行代码做了大量的工作。我们先来看看函数open() 。要以任何方式使用文件——哪怕仅仅是打印其内容,都得先打开 文件,这样才能访问它。函数open() 接受一个参数:要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。在这个示例中,当前运行的是file_reader.py,因此Python在file_reader.py所在的目录中查找pi_digits.txt。函数open() 返回一个表示文件的对象。在这里,open(‘pi_digits.txt’) 返回一个表示文件pi_digits.txt 的对象;Python将这个对象存储在我们将在后面使用的变量中。

关键字with 在不再需要访问文件后将其关闭。在这个程序中,注意到我们调用了open() ,但没有调用close() ;你也可以调用open() 和close() 来打开和关闭文件,但这样做时,如果程序存在bug,导致close() 语句未执行,文件将不会关闭。这看似微不足道,但未妥善地关闭文件可能会导致数据丢失或受损。如果在程序中过早地调用close() ,你会发现需要使用文件时它已关闭 (无法访问),这会导致更多的错误。并非在任何情况下都能轻松确定关闭文件的恰当时机,但通过使用前面所示的结构,可让Python去确定:你只管打开文件,并在需要时使用它,Python自会在合适的时候自动将其关闭。

有了表示pi_digits.txt的文件对象后,我们使用方法read() (前述程序的第2行)读取这个文件的全部内容,并将其作为一个长长的字符串存储在变量contents 中。这样,通过打印contents 的值,就可将这个文本文件的全部内容显示出来:

在这里插入图片描述

向文件中写入数据

保存数据的最简单的方式之一是将其写入到文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。

要将文本写入文件,你在调用open() 时需要提供另一个实参,告诉Python你要写入打开的文件。为明白其中的工作原理,我们来将一条简单的消息存储到文件中,而不是将其打印到屏幕上:

write_message.py

filename = 'programming.txt'

with open(filename, 'w') as file_object:
	file_object.write("I love programming.")

在这个示例中,调用open() 时提供了两个实参。第一个实参也是要打开的文件的名称;第二个实参(‘w’ )告诉Python,我们要以写入模式 打开这个文件。打开文件时,可指定读取模式 (‘r’ )、写入模式 (‘w’ )、附加模式 (‘a’ )或让你能够读取和写入文件的模式(‘r+’ )。如果你省略了模式实参,Python将以默认的只读模式打开文件。

如果你要写入的文件不存在,函数open() 将自动创建它。然而,以写入(‘w’ )模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。

我们使用文件对象的方法write() 将一个字符串写入文件。这个程序没有终端输出,但会生成一个但文件programming.txt,如果你打开文件programming.txt,将看到其中包含如下一行内容:

在这里插入图片描述
在这里插入图片描述

异常处理

Python使用被称为异常 的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。

异常是使用try-except 代码块处理的。try-except 代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。使用了try-except 代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。

下面来看一种导致Python引发异常的简单错误。你可能知道不能将一个数字除以0,但我们还是让Python这样做吧:

division.py

print(5/0)

显然,Python无法这样做,因此你将看到一个traceback:

在这里插入图片描述

在上述traceback中,指出的错误ZeroDivisionError 是一个异常对象。Python无法按你的要求做时,就会创建这种对象。在这种情况下,Python将停止运行程序,并指出引发了哪种异常,而我们可根据这些信息对程序进行修改。下面我们将告诉Python,发生这种错误时怎么办;这样,如果再次发生这样的错误,我们就有备无患了。

当你认为可能发生了错误时,可编写一个try-except 代码块来处理可能引发的异常。你让Python尝试运行一些代码,并告诉它如果这些代码引发了指定的异常,该怎么办。

处理ZeroDivisionError 异常的try-except 代码块类似于下面这样:

try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divide by zero!")

我们将导致错误的代码行print(5/0) 放在了一个try 代码块中。如果try 代码块中的代码运行起来没有问题,Python将跳过except 代码块;如果try 代码块中的代码导致了错误,Python将查找这样的except 代码块,并运行其中的代码,即其中指定的错误与引发的错误相同。

在这个示例中,try 代码块中的代码引发了ZeroDivisionError 异常,因此Python指出了该如何解决问题的except 代码块,并运行其中的代码。这样,用户看到的是一条友好的错误消息,而不是traceback:

在这里插入图片描述

如果try-except 代码块后面还有其他代码,程序将接着运行,因为已经告诉了Python如何处理这种错误。下面来看一个捕获错误后程序将继续运行的示例。

发生错误时,如果程序还有工作没有完成,妥善地处理错误就尤其重要。这种情况经常会出现在要求用户提供输入的程序中;如果程序能够妥善地处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。

下面来创建一个只执行除法运算的简单计算器:

division.py

print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")

while True:
	first_number = input("\nFirst number: ")
		if first_number == 'q':
		break
	second_number = input("Second number: ")
		if second_number == 'q':
		break
	answer = int(first_number) / int(second_number)
	print(answer)

这个程序提示用户输入一个数字,并将其存储到变量first_number 中;如果用户输入的不是表示退出的q,就再提示用户输入一个数字,并将其存储到变量second_number 中。接下来,我们计算这两个数字的商(即answer )。这个程序没有采取任何处理错误的措施,因此让它执行除数为0的除法运算时,它将崩溃:

在这里插入图片描述

程序崩溃可不好,但让用户看到traceback也不是好主意。不懂技术的用户会被它们搞糊涂,而且如果用户怀有恶意,他会通过traceback获悉你不希望他知道的信息。例如,他将知道你的程序文件的名称,还将看到部分不能正确运行的代码。有时候,训练有素的攻击者可根据这些信息判断出可对你的代码发起什么样的攻击。

通过将可能引发错误的代码放在try-except 代码块中,可提高这个程序抵御错误的能力。错误是执行除法运算的代码行导致的,因此我们需要将它放到try-except 代码块中。这个示例还包含一个else 代码块;依赖于try 代码块成功执行的代码都应放到else 代码块中:

print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")

while True:
    first_number = input("\nFirst number: ")
    if first_number == 'q':
        break
    second_number = input("Second number: ")
   try:
        answer = int(first_number) / int(second_number)
   except ZeroDivisionError:
        print("You can't divide by 0!")
   else:
        print(answer)

我们让Python尝试执行try 代码块中的除法运算,这个代码块只包含可能导致错误的代码。依赖于try 代码块成功执行的代码都放在else 代码块中;在这个示例中,如果除法运算成功,我们就使用else 代码块来打印结果。

except 代码块告诉Python,出现ZeroDivisionError 异常时该怎么办。如果try 代码块因除零错误而失败,我们就打印一条友好的消息,告诉用户如何避免这种错误。程序将继续运行,用户根本看不到traceback:

在这里插入图片描述

try-except-else 代码块的工作原理大致如下:Python尝试执行try 代码块中的代码;只有可能引发异常的代码才需要放在try 语句中。有时候,有一些仅在try 代码块成功执行时才需要运行的代码;这些代码应放在else 代码块中。except 代码块告诉Python,如果它尝试运行try 代码块中的代码时引发了指定的异常,该怎么办。

通过预测可能发生错误的代码,可编写健壮的程序,它们即便面临无效数据或缺少资源,也能继续运行,从而能够抵御无意的用户错误和恶意的攻击。

Json序列化

很多程序都要求用户输入某种信息,如让用户存储游戏首选项或提供要可视化的数据。不管专注的是什么,程序都把用户提供的信息存储在列表和字典等数据结构中。用户关闭程序时,你几乎总是要保存他们提供的信息;一种简单的方式是使用模块json 来存储数据。

模块json 让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。你还可以使用json 在Python程序之间分享数据。更重要的是,JSON数据格式并非Python专用的,这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。这是一种轻便格式,很有用,也易于学习。

注意: JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用。

我们来编写一个存储一组数字的简短程序,再编写一个将这些数字读取到内存中的程序。第一个程序将使用json.dump() 来存储这组数字,而第二个程序将使用json.load() 。

函数json.dump() 接受两个实参:要存储的数据以及可用于存储数据的文件对象。下面演示了如何使用json.dump() 来存储数字列表:

number_writer.py

import json

numbers = [2, 3, 5, 7, 11, 13]

filename = 'numbers.json'
with open(filename, 'w') as f_obj:
    json.dump(numbers, f_obj)

我们先导入模块json ,再创建一个数字列表。我们指定了要将该数字列表存储到其中的文件的名称。通常使用文件扩展名.json来指出文件存储的数据为JSON格式。接下来,我们以写入模式打开这个文件,让json 能够将数据写入其中。然后,我们使用函数json.dump() 将数字列表存储到文件numbers.json中。

这个程序没有输出,但我们可以打开文件numbers.json,看看其内容。数据的存储格式与Python中一样:

在这里插入图片描述

在这里插入图片描述

下面再编写一个程序,使用json.load() 将这个列表读取到内存中:

numberreader.py

import json

filename = 'numbers.json'
with open(filename) as f_obj:
    numbers = json.load(f_obj)

print(numbers)

首先,我们确保读取的是前面写入的文件。这次我们以读取方式打开这个文件,因为Python只需读取这个文件。然后,我们使用函数json.load() 加载存储在numbers.json中的信息,并将其存储到变量numbers 中。最后,我们打印恢复的数字列表,看看它是否与number_writer.py中创建的数字列表相同:

在这里插入图片描述

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

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

相关文章

Simple RPC - 02 通用高性能序列化和反序列化设计与实现

文章目录 概述设计实现通用的序列化接口通用的序列化实现【推荐】 vs 专用的序列化实现专用序列化接口定义序列化实现 概述 网络传输和序列化这两部分的功能相对来说是非常通用并且独立的,在设计的时候,只要能做到比较好的抽象,这两部的实现…

RHCE---shell 基本知识

文章目录 目录 文章目录 前言 一.shell 概述 如何编写shell脚本 脚本开头 脚本内容 执行脚本 bash shell 基本功能 echo打印命令 printf 命令 history历史命令 命令别名 总结 前言 在UNIX和类UNIX操作系统中,Shell是一个非常重要的组件,为用户提供…

Jmeter —— jmeter利用取样器中http发送请求

使用Jmeter发送HTTP请求 取样器是用来模拟用户操作,向服务器发送请求以及接收服务器的响应数 据的一类元件,其中HTTP请求取样器是用来模拟常用的http请求的 步骤如下: 步骤一:添加线程组 右击测试计划——添加——线程&#x…

大数据学习(13)-join优化详解

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博>主哦&#x…

工业自动化控制通信协议Profinet系列-1、了解Profinet协议及收集资料

工业自动化控制通信协议Profinet系列-1、了解Profinet协议及收集资料 文章目录 工业自动化控制通信协议Profinet系列-1、了解Profinet协议及收集资料一、前言二、Profinet了解及资料收集1. 资料2. PROFINET到底是什么?3. 网络模型4. 应用场景 三、接下来 一、前言 …

最详细的Keycloak教程(建议收藏):Keycloak实现手机号、验证码登陆——(二)Keycloak与SpringBoot的集成

上一篇已经介绍了keycloak的下载与使用: Keycloak的下载与使用 本文章和大家分享keycloak怎么去集成springboot项目,以及怎么去做接口权限的校验。 PS:根据红帽的公告,目前在springboot 3.x版本已经不支持keycloak适配器,所以本章…

44岁的「老板」想变年轻

作者 | 辰纹 来源 | 洞见新研社 从村办集体企业余杭县红星五金厂起家,到生产贴牌油烟机,再到注册“老板”商标,改制有限公司,老板电器已经走过了44个春秋。 在这44年中,老板电器是首家登陆资本市场的高端厨电企业&am…

Java总结的question

Java 数据类型 Q1:基本类型和包装类型的区别? 用途:在对象属性中一般用包装类型,包装类型可用于泛型,基本类型不可以存储方式:包装类型一般放在堆,基本数据类型的局部变量一般放在栈中的局部变量表&…

页表置换算法之最佳置换算法(OPT),先进先出置换算法(FIFO),最近最久未使用置换算法(LRU),时钟置换算法(CLOCK)

请求分页存储管理与基本分页存储管理的主要区别: 在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。页…

22-数据结构-内部排序-选择排序

简介:每一趟选择最小或最大的一个,排在前面或后面。主要右简单选择排序和堆排序 一、简单选择排序 1.1简介: 每趟选择最小的,放在前面,一次类推,代码思想:两个循环,外循环是趟数&a…

IDEA提高工作效率的实用技巧

IDEA是一款备受开发者喜爱的集成开发环境,它提供了许多实用的功能,可以帮助我们更快速、更高效地编写代码。本文将介绍一些IDEA的使用技巧提高工作效率的实用技巧。 验证正则表达式 要验证编写的正则表达式是否正确,只需将光标放在要检查的…

【单片机毕业设计】【hj-006-6】天然气、有害混合气体检测 | 空气质量检测 | 有害气体检测

一、基本介绍 项目名: 基于单片机的天然气、有害混合气体检测系统设计 基于单片机的空气质量检测系统设计 基于单片机的 有害气体检测系统设计 项目编号:mcuclub-hj-006-6 单片机类型:STC89C52 具体功能: 1、通过MQ-5检测天然气…

C语言——二周目——输入输出辨析

一、对输入输出的理解 1.明确输入的意义 以往的输入为默认形式(标准输入流——stdin——键盘)。但是输入的形式不止此一种。可以从键盘上敲出输入的数据,同时也可以将文件中、某个字符串甚至结构体的数据作为输入内容进行输入。 输入&#x…

Spring boot 集成 xxl-job

文章目录 xxl-job 简介引入xxl-job依赖配置xxl-job config添加properties文件配置BEAN模式(方法形式)步骤一:执行器项目中,开发Job方法:步骤二:调度中心,新建调度任务 xxl-job 简介 官网:https:…

【虹科干货】Redis Enterprise vs ElastiCache——如何选择缓存解决方案?

使用Redis 或 Amazon ElastiCache 来作为缓存加速已经是业界主流的解决方案,二者各有什么优势?又有哪些区别呢? 文况速览: - Redis 是什么? - Redis Enterprise 是什么? - Amazon ElastiCache 是什么&…

阿里云高庆瑞:高弹性、高可用、低成本的云上资源管理最佳实践

云布道师 为了更好地帮助用户在借助 DevOps 工具缩短开发周期、提升业务效率的同时,也能让业务保持稳定、安全、可靠,且低成本地持续运营,阿里云弹性计算团队独家出品的【弹性计算技术公开课_CloudOps 云上运维季】正式启动。阿里云弹性计算团…

提升服装门店管理效率与顾客体验的RFID智慧门店解决方案

随着科技的不断进步,传统的服装门店在管理过程中面临着一些瓶颈和挑战,条码管理费时费力,服装查找耗时长,库存盘点不准确,销售管理不科学,顾客体验性较差等问题已经成为制约门店发展的难题,为了…

小程序之实例会议OA的首页 (3)

⭐⭐ 小程序专栏:小程序开发专栏 ⭐⭐ 个人主页:个人主页 目录 ​编辑 一.前言 二.flex弹性布局 flex属性 2.1 display: flex 弹性布局属性 2.2 flex-direction属性 2.3 flex-wrap属性 2.4 flex-flow属性 2.5 justify-content属性 三.首页轮播…

12.Bilinear Forms

Bilinear Forms 双线性形式 Metric Tensor 度量张量是双线性形式的一种。 在学习张量积之前,先讨论一般的线性形式 回顾一下上一节学的 Metric Tensor 度量张量所表示的矩阵 是个 对称矩阵。, 度量张量的性质: 双线性形式 定义&#xf…

《算法通关村第二关——终于学会链表反转了》

《算法通关村第二关——终于学会链表反转了》 今天学习链表反转 为什么反转这么重要呢?因为反转链表涉及结点的增加、删除等多种操作,能非常有效考察思维能力和代码驾驭能力。另外很多题目也都要用它来做基础, 例如指定区间反转、链表K个一…