Python学习DAY09_文件和异常

文件和异常

        实际开发中常常会遇到对数据进行持久化操作的场景,而实现数据持久化最直接简单的方式就是将数据保存到文件中。

        在 Python 中实现文件的读写操作其实非常简单,通过 Python 内置的 open 函数,我们可以指定文件名、操作模式、编码信息等来获得操作文件的对象,接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件(字符文件还是二进制文件)以及做什么样的操作(读、写还是追加)。

操作模式具体含义
r读写
w写入(会截断之前的内容)
x写入,如果文件已经存在会产生异常
a追加,将内容写入到已有文件的末尾
b二进制模式
t文本模式
+更新(可读又可写)

读写文本文件 

         读取文本文件时,需要在使用 open 函数时指定好带路径的文件名(可以使用相对路径或绝对路径)并将文件模式设置为 r (如果不指定,默认值也是'r'),然后通过 encoding 参数指定编码(如果不指定,默认值是 None,那么在读取文件时使用的是操作系统默认的编码),如果不能保证保存文件时使用的编码方式与 encoding 参数指定的编码方式是一致的,那么就可能因无法解码字符而导致读取失败。

def main():file = open('test.txt', 'r', encoding='utf-8')print(file.read())file.close()if __name__ == '__main__':main()

        如果 open 函数指定的文件并不存在或者无法打开,那么将引发异常状况导致程序崩溃。为了让代码有一定的健壮性和容错性,我们可以使用 Python 的异常机制对可能在运行时发生状况的代码进行适当的处理。

def main():file = Nonetry:file = open('test.txt', 'r', encoding='utf-8')print(file.read())except FileNotFoundError:print('无法打开指定的文件!')except LookupError:print('指定了未知的编码!')except UnicodeDecodeError:print('读取文件时解码错误!')finally:if file:file.close()if __name__ == '__main__':main()

        在 Python 中,我们可以将那些在运行时可能会出现状况的代码放在 try 代码块中,在 try 代码块的后面可以跟上一个或多个 except 来捕获可能出现的异常状况。例如在上面读取文件的过程中,文件找不到会引发 FileNotFoundError ,指定了未知的编码会引发 LookupError ,而如果读取文件时无法按指定方式解码会引发 UnicodeDecodeError ,我们在 try 后面跟上了三个 except 分别处理这三种不同的异常状况。最后我们使用 finally 代码块来关闭打开的文件,释放掉程序中获取的外部资源,由于 finally 块的代码不论程序正常还是异常都会执行到(甚至是调用了 sys 模块的 exit 函数退出 Python 环境, finally 块都会被执行,因为 exit 函数实质上是引发了 SystemExit 异常),因此我们通常把 finally 块称为“总是执行代码块”,它最适合用来做释放外部资源的操作。如果不愿意在 finally 代码块中关闭文件对象释放资源,也可以使用上下文语法,通过 with 关键字指定文件对象的上下文环境并在离开上下文环境时自动释放文件资源。

def main():try:with open('test.txt', 'r', encoding='utf-8') as file:print(file.read())except FileNotFoundError:print('无法打开指定的文件!')except LookupError:print('指定了未知的编码!')except UnicodeDecodeError:print('读取文件时解码错误!')if __name__ == '__main__':main()

        除了使用文件对象的 read 方法读取文件之外,还可以使用 for-in 循环逐行读取或者用 readlines 方法将文件按行读取到一个列表容器中。

def main():# 一次性读取整个文件内容with open('test.txt', 'r', encoding='utf-8') as file:print(file.read())# 通过for-in循环逐行读取with open('test.txt', mode='r') as file:for line in file:print(line, end='')print()# 读取文件按行读取到列表中with open('test.txt') as file:lines = file.readlines()print(lines)if __name__ == '__main__':main()

        要将文本信息写入文件文件也非常简单,在使用 open 函数时指定好文件名并将文件模式设置为 w 即可。注意如果需要对文件内容进行追加式写入,应该将模式设置为 a 。如果要写入的文件不存在会自动创建文件而不是引发异常。

        将1~99分别写入两个文件中(1~50写入test1.txt,51~99写入test2.txt)。

def main():filenames = ('test1.txt', 'test2.txt')file_list = []try:for filename in filenames:file_list.append(open(filename, 'a', encoding='utf-8'))for number in range(1, 100):if number < 100:file_list[0].write(str(number) + '\n')else:file_list[1].write(str(number) + '\n')except IOError as ex:print(ex)print('写文件时发生错误!')finally:for file in file_list:file.close()print('操作完成!')if __name__ == '__main__':main()

读写二进制文件

        在了解完文本文件的读写后,再学习二进制文件的读写就很简单,只需要在模式中加入 b 即可。

        实现复制图片的功能。

def main():try:with open('tp1.jpg', 'rb') as file1:data = file1.read()print(type(data))  # <class 'bytes'>with open('tp2.jpg', 'wb') as file2:file2.write(data)except FileNotFoundError as e:print('指定的文件无法打开.')except IOError as e:print('读写文件异常.')if __name__ == '__main__':main()

读写JSON文件

         我们已经了解如何将文本数据和二进制数据保存到文件中,那么又该如何将一个列表或者一个字典中的数据保存到文件中呢?

        列表和字典中的数据可以通过 JSON 格式保存到文件中。

        JSON 是 “JavaScript Object Notation” 的缩写,它本来是 JavaScript 语言中创建对象的一种字面量语法,现在已经被广泛的应用于跨平台跨语言的数据交换,原因很简单,因为JSON也是纯文本,任何系统任何编程语言处理纯文本都是没有问题的。目前 JSON 基本上已经取代了 XML 作为异构系统间交换数据的事实标准。 

        简单的 JSON 例子。 

{"name": "小明","age": 12,"phone": 1888888,"friends": ["小红", "小白"],"toys": [{"tname": "悠悠球", "price": 25},{"tname": "陀螺", "price": 10},{"tname": "遥控汽车", "price": 200}]
}

        上面的 JSON 跟 Python 中的字典其实是一样一样的,事实上 JSON 的数据类型和 Python 的数据类型是很容易找到对应关系的。

JSONPython
objectdict
arraylist
stringstr
numberint/float
true/falseTrue/False
nullNone

        使用 Python 中的 json 模块就可以将字典或列表以 JSON 格式保存到文件中。

import jsondef main():mydict = {"name": "小明","age": 12,"phone": 1888888,"friends": ["小红", "小白"],"toys": [{"tname": "悠悠球", "price": 25},{"tname": "陀螺", "price": 10},{"tname": "遥控汽车", "price": 200}]}try:with open('data.json', 'w', encoding='utf-8') as file:json.dump(mydict, file)except IOError as e:print(e)print('保存数据完成!')if __name__ == '__main__':main()

        json模块主要有四个比较重要的函数,分别是:

  • dump - 将Python对象按照JSON格式序列化到文件中
  • dumps - 将Python对象处理成JSON格式的字符串
  • load - 将文件中的JSON数据反序列化成对象
  • loads - 将字符串的内容反序列化成Python对象

         序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换为可以存储或传输的形式,这样在需要的时候能够恢复到原先的状态,而且通过序列化的数据重新获取字节时,可以利用这些字节来产生原始对象的副本(拷贝)。与这个过程相反的动作,即从一系列字节中提取数据结构的操作,就是反序列化(deserialization)。

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

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

相关文章

商业江湖大揭秘:月入千万与颗粒无收,究竟差了什么?

在商业的浩瀚江湖 英雄豪杰们或乘风破浪、月入千万&#xff0c;或步履蹒跚、颗粒无收&#xff0c;这背后的奥秘究竟何在&#xff1f;是天意难测&#xff0c;还是人为疏忽&#xff1f;是制度的不完善&#xff0c;还是工具的滞后不前&#xff1f;答案就隐藏在你未曾注意的细节之…

公司招嵌入式开发岗位,为什么感觉一年比一年难?

最近看到一个问题&#xff1a; 是一个HR在吐槽招不到嵌入式开发的人才。 这句话&#xff0c;难免会误导一些想入行嵌入式的同学&#xff0c;卧槽&#xff0c;这么缺人?赶紧冲&#xff01; 哼次哼次学完一堆技术栈&#xff0c;一投简历&#xff0c;一个面试机会都没有。 这就是…

24路电磁锁主板在智能存储系统中的作用

在无人值守场景中&#xff0c;如自助服务机、智能生鲜柜、共享储物柜等&#xff0c;使用24路电磁锁主板可以集成身份识别技术&#xff0c;将用户的验证结果转化为相应的开锁动作&#xff0c;提升用户体验和运营效率&#xff0c;是实现智能存储系统高效、安全和自动化运行的关键…

Kubernetes的五大开源存储项目

在Kubernetes中&#xff0c;关于数据的持久化管理是一种挑战&#xff0c;对此&#xff0c;社区提供了多种存储的解决方案&#xff0c;这些方案旨在简化和优化容器化应用程序的持久化数据管理。 现介绍 Kubernetes 的五大开源存储项目&#xff0c;带你了解开源存储解决方案的多…

unity后期

unity|后处理篇 前言一、Post-Processing 1、 Post-Processing的使用2、Post-Processing后处理效果 抗锯齿①、Ambient Occlusion 环境光遮蔽②、Auto Exposure 自动曝光③、Bloom 辉光/泛光④、Chromatic Aberration | 色差⑤、Color Grading 色调/颜色分级⑥、Depth Of Fiel…

锐捷网络携数据中心、以太全光等创新解决方案亮相2024MWC

在西班牙巴塞罗那举行的2024年世界移动通信大会(MWC)上,锐捷网络(下文简称“锐捷”)展示了将技术与应用充分融合的云数据中心、5G、光网络等产品及解决方案,帮助更多行业组织建设更贴近业务、智能、简单、高效、绿色低碳的网络基础设施,应对当下及未来的挑战,共同连接更广阔可能…

骨传导耳机好用吗?六大选购法则与避坑技巧大公开

在过去的两年里&#xff0c;骨传导耳机逐渐成为大众的新宠&#xff0c;这一趋势并不出人意料。毕竟长时间使用音量过大的传统入耳式耳机&#xff0c;多多少少会对我们的听力健康构成威胁。然而不同耳机对听力的潜在影响程度是有差异的。骨传导耳机好用吗&#xff1f;与传统耳机…

租床小程序|租床系统|租赁软件开发功能

随着移动互联网的普及&#xff0c;越来越多的人开始选择在线上完成各种租赁业务&#xff0c;而医院租床也不例外。在这个趋势下&#xff0c;开发一款租赁小程序成为了市场的必然需求。 租床小程序的功能 1、搜索与筛选 为了满足不同用户的需求&#xff0c;小程序应该提供设备…

android适配器adapter,Android程序员架构之路该如何继续学习

便于开发的插件、工具和第三方开源库 1.GsonFormat 使用方法&#xff1a;快捷键AltS也可以使用AltInsert选择GsonFormat&#xff0c;作用&#xff1a;速将json字符串转换成一个Java Bean&#xff0c;免去我们根据json字符串手写对应Java Bean的过程。 2.ButterKnife Zelezny …

【Linux C | 网络编程】getaddrinfo 函数详解及C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

element-plus 的el-img组件访问oss图片自动拼接前端地址

这是我的组件代码 <el-image style"width: 100px; height: 100px" :src"scope.row.logo" />访问时候 竟然凭借上了前端的地址端口 原来是我的oss服务是使用了域名做cdn加速的 内容分发网络&#xff08;CDN&#xff09;或者服务器配置&#xff0c;可…

安全防御(第六次作业)

攻击可能只是一个点&#xff0c; 防御需要全方面进行 IAE引擎 DFI和DPI技术 --- 深度检测技术 DPI --- 深度包检测技术 --- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09; &#xff0c;之后对 数据包的内容进行识别。&#xff08;应用层&a…

【湖南省建筑类中级职称申报攻略】企业专场条件宽松,不费劲拿证书!

【湖南省建筑类中级职称申报攻略】企业专场条件宽松&#xff0c;不费劲拿证书&#xff01; 2024年湖南省电力电气工程师申报评审/企业专场不费劲 湖南省建筑类中级职称申报评审都是以考代评&#xff0c;符合条件参加考试&#xff0c;考试合格了&#xff0c;职称申报审核通过就…

c语言经典测试题8

在c语言经典测试题6的第一题&#xff0c;大家是否想过可不可以将递归参数改为s呢&#xff1f;或许有的人已经试过了&#xff0c;但是发现好像不会有结果&#xff0c;其实是因为s为后置&#xff0c;先试用后加1&#xff0c;然而我们这个是在s出了函数之后才会运行加1操作&#x…

CentOS 7开启Web服务

之前有写过用kali开启web服务方法&#xff0c;这次写个用cendos7开启服务的步骤&#xff01; 1、安装httpd yum install -y httpd 若显示安装失败&#xff0c;报错原因为找不到httpd的安装包&#xff0c;可参考这篇文件更新yum源&#xff1a;CentOS 7更换yum源|详细步骤-CSDN…

CDN CloudFlare 接入 OCI 对象存储

在当今数字化时代&#xff0c;网站性能和可用性是业务成功的关键。为了提供快速且可靠的访问体验&#xff0c;许多组织正在寻找有效的内容分发网络&#xff08;CDN&#xff09;解决方案。CloudFlare作为业界领先的CDN提供商&#xff0c;其强大的全球网络基础设施能够加速网站内…

《PyTorch深度学习实践》第十二讲循环神经网络基础

一、RNN简介 1、RNN网络最大的特点就是可以处理序列特征&#xff0c;就是我们的一组动态特征。比如&#xff0c;我们可以通过将前三天每天的特征&#xff08;是否下雨&#xff0c;是否有太阳等&#xff09;输入到网络&#xff0c;从而来预测第四天的天气。 我们可以看RN…

Python实现双向链表:从基础到应用

一、引言 双向链表是一种比单向链表更复杂的数据结构&#xff0c;每个节点除了包含数据和指向下一个节点的指针外&#xff0c;还包含一个指向前一个节点的指针。这种结构使得我们可以从链表的任何节点开始&#xff0c;向前或向后遍历链表。 目录 一、引言 二、节点定义 三、…

OPPO打响AI手机第一枪

明敏 发自 凹非寺 量子位 | 公众号 QbitAI 2024开年&#xff0c;AI趋势依旧高歌猛进。 一边&#xff0c;Sora爆火成为现象级AIGC应用&#xff0c;带动AI再度成为春节后全民热议的第一话题。另一边&#xff0c;手机厂商开始大举All in AI&#xff0c;“放弃传统智能手机”、“…

【Qt】Sqlite数据库加密

1. 加密方式 对数据库文件加密。既不会暴露表结构&#xff0c;也不会暴露数据细节。 2. 加密工具&#xff08;QtCipherSqlitePlugin&#xff09; 用于密码 SQLite 的 Qt 插件&#xff0c;它基于 SQLite 源和 wxWidget 中的 wxSQLite3插件github地址&#xff1a;https://gith…