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 = None
    try:
        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 json


def 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)。

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

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

相关文章

定时任务调动框架Quartz+SpringBoot集成

Quartz 是一个基于 Java 的广泛使用的开源的任务调度框架 官网&#xff1a; http://www.quartz-scheduler.org/ 源码&#xff1a; https://github.com/quartz-scheduler/quartz 整个 Quartz 的代码流程基本基本如下&#xff1a; 1、首先需要创建我们的任务(Job)&#xff0c…

【重要公告】BSV区块链协会宣布将启动多项动态安全增强措施

​​发表时间&#xff1a;2024年2月16日 2024年2月16日&#xff0c;瑞士楚格 - BSV区块链协议的管理机构BSV区块链协会&#xff08;以下简称“BSV协会”&#xff09;宣布对其运营模式实施全新的安全架构&#xff0c;其中包括引入网络访问规则和数字资产找回协议&#xff0c;以及…

【Go语言】Go语言中的字典

Go语言中的字典 字典就是存储键值对映射关系的集合&#xff0c;在Go语言中&#xff0c;需要在声明时指定键和值的类型&#xff0c;此外Go语言中的字典是个无序集合&#xff0c;底层不会按照元素添加顺序维护元素的存储顺序。 如下所示&#xff0c;Go语言中字典的简单示例&…

Linux系统Docker部署Nexus Maven并实现远程访问本地管理界面

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

如果大数据中多头借贷风险严重怎么办呢?

在大数据报告中&#xff0c;多头借贷风险、逾期风险、联系人风险、司法风险等是大数据评分评级的重要组成部分&#xff0c;大数据多头借贷风险也是很多银行和金融平台比较看重的&#xff0c;那如果大数据中多头借贷风险严重怎么办呢?本文详细为大家讲讲。 大数据多头风险是什么…

Niginx介绍和安装使用

Nginx是什么&#xff1f; Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一…

代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数 、236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 题目链接/文章讲解&#xff1a; 代码随想录 视频讲解&#xff1a;二叉搜索树中&#xff0c;需要掌握如何双指针遍历&#xff01;| LeetCode&#xff1a;530.二叉搜索树的最小绝对差_哔哩哔哩_bilibili 1.方法1 1.1分析及思路 了解到差值最小的数…

DevEco Studio下载与安装(Windows)

下载地址&#xff1a; HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 安装时直接点击 next 即可。 运⾏已安装的DevEco Studio&#xff0c;⾸次使⽤&#xff0c;请选择Do not import settings&#xff0c;单击OK。 1.安装Node.js 如果本地有下载&#xff0c;可以…

C程序的编译过程

目录 一、GCC编译器 二、编译过程 1、预处理&#xff08;Preprocessing&#xff09; 2、编译&#xff08;Compilation&#xff09; 3、汇编&#xff08;Assembly&#xff09; 4、链接&#xff08;Linking&#xff09; 三、秋招真题演练 一、GCC编译器 在这里&#xf…

linux系统Jenkins工具web配置

Jenkins工具配置 插件配置系统配置系统工具配置 插件配置 下载 Maven Integration Pipeline Maven lntegration gitlab Generic webhook Trigger nodejs Blue ocean系统配置 系统配置结束系统工具配置

androidframework开发面试,阿里P8成长路线

字节跳动Android面经 一面问的 Java 和 Android 基础 1、Jvm虚拟机 2、messageQueue会不会阻塞ui线程 3、对象锁和类锁 4、之字形打印树 5、还有其他的 《Android学习笔记总结最新移动架构视频大厂安卓面试真题项目实战源码讲义》 **完整开源项目&#xff1a;docs.qq.com/doc…

Linux命名管道

Linux匿名管道-CSDN博客 目录 1.原理 2.接口实现 3.模拟日志 Linux匿名管道-CSDN博客 这上面叫的是匿名管道&#xff0c;不要将两者搞混&#xff0c;匿名管道说的是两个有血缘关系的进程相互通信&#xff0c;但是命名管道就是两个没有关系的管道相互通信。 1.原理 和匿名…

解密犯罪时间 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 警察在侦破一个案件时&#xff0c;得到了线人给出的可能犯罪时间&#xff0c;形如 HH:MM 表示的时刻。 根据警察和线人的约定&#xff0c;为了隐蔽&#xff0c;该…

RabbitMQ实战学习

RabbitMQ实战学习 文章目录 RabbitMQ实战学习RabbitMQ常用资料1、安装教程2、使用安装包3、常用命令4、验证访问5、代码示例 一、RabbitMQ基本概念1.1. MQ概述1.2 MQ 的优势和劣势1.3 MQ 的优势1. 应用解耦2. 异步提速3. 削峰填谷 1.4 MQ 的劣势1.5 RabbitMQ 基础架构1.6 JMS 二…

图形系统开发实战课程:进阶篇(上)——8.图形样式

图形开发学院&#xff5c;GraphAnyWhere 课程名称&#xff1a;图形系统开发实战课程&#xff1a;进阶篇(上)课程章节&#xff1a;“图形样式”原文地址&#xff1a;https://www.graphanywhere.com/graph/advanced/2-8.html 第八章 图形样式 1. 填充和描边 \quad 在图形系统实战…

vision mamba 运行训练记录,解决bimamba_type错误

下载vision mamba github上的项目后&#xff0c;解压&#xff0c;进入文件夹项目&#xff0c;然后配环境 unzip Vim-main.zip cd Vim-mainconda create -n mamba python3.10.13conda activate mamba pip install torch2.1.1 torchvision0.16.1 torchaudio2.1.1 --index-url ht…

java面试(网络)

TCP和UDP有什么区别&#xff1f;TCP三次握手不是两次&#xff1f; TCP&#xff1a;面向连接&#xff0c;可靠的&#xff0c;传输层通信协议。点对点&#xff0c;占用资源多&#xff0c;效率低。 UDP&#xff1a;无连接&#xff0c;不可靠&#xff0c;传输层通信协议。广播&…

照片中不想要的部分怎么去除?教你几个小妙招

照片在我们的生活中占据着无可替代的地位。它们是我们生活的缩影&#xff0c;定格住我们的瞬间&#xff0c;记录着我们的记忆&#xff0c;让我们可以随时随地回顾过去的美好时光。无论是家庭聚会、旅行、婚礼还是其他重要的场合&#xff0c;我们都会用照片来捕捉这些珍贵的时刻…

springboot 实现本地文件存储

springboot 实现本地文件存储 实现过程 上传文件保存文件&#xff08;本地磁盘&#xff09;返回文件HTTP访问服务器路径给前端&#xff0c;进行效果展示 存储 服务端接收上传的目的是提供文件的访问服务&#xff0c;对于SpringBoot而言&#xff0c;其对静态资源访问提供了很…

【Java设计模式】三、

文章目录 0、案例&#xff1a;咖啡屋1、简单工厂模式 静态工厂&#xff08;不属于23种之列&#xff09;2、工厂方法模式3、抽象工厂模式4、建造者模式5、原型设计模式 0、案例&#xff1a;咖啡屋 模拟咖啡店点餐。咖啡有多种&#xff0c;抽象类&#xff0c;子类为各种咖啡。咖…