Python学习DAY09_文件和异常

news2024/9/21 2:37:23

文件和异常

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

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

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

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

相关文章

物联网主机E6000引领工业自动化的新篇章

E6000——多协议、多接口的全能战士 在工业4.0的大潮中&#xff0c;物联网的应用正在逐步深入到各个领域。而E6000物联网主机就是其中的佼佼者&#xff0c;它以其卓越的性能和强大的功能&#xff0c;成为推动工业自动化发展的一股重要力量。 E6000是一款多协议、多接口的物联…

Tomcat安装,配置文件、组件

一、Tomcat的基本功能 1.1.Tomcat是什么&#xff1f; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;T…

【Django】执行查询—跨关系查询中的跨多值关联问题

跨多值查询 跨越 ManyToManyField 或反查 ForeignKey &#xff08;例如从 Blog 到 Entry &#xff09;时&#xff0c;对多个属性进行过滤会产生这样的问题&#xff1a;是否要求每个属性都在同一个相关对象中重合。 filter() 先看filter()&#xff0c;通过一个例子看&#xf…

mysql,for循环执行sql

遇到一个问题&#xff0c;我需要模拟上百万数据来优化sql&#xff0c;线上数据down不下来&#xff0c;测试库又没有&#xff0c;写代码执行要么慢要么就是sql语句太长。 于是&#xff0c;直接用mysql自带的功能去实现&#xff01; 简单而简单 mysql可以for循环&#xff1f;没…

vue中将某个不太规则的json转成对象,或者将对象转成json字符串

vue中将某个不太规则的json转成对象&#xff0c;或者将对象转成json字符串 以我自己做的项目某个不规则的json为例 将json对象转成json字符串&#xff1a; JSON.stringify(jsonData); 将不规则json字符串转成对象并获取对应的属性的值&#xff1a; JSON.parse(jsonData).Name…

机器学习项目外包注意事项

将机器学习项目外包给外部团队或合作伙伴是一种常见的做法&#xff0c;特别是当您的团队缺乏特定领域的专业知识或资源时。以下是一些关于机器学习项目外包的要点和注意事项&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#…

JavaScript new、apply call 方法

new、apply、call、bind JavaScript 中的 apply、call和 bind 方法是前端代码开发中相当重要的概念&#xff0c;并且与 this 的指向密切相关 new new 关键词的主要作用 就是执行一个构造函数、返回一个实例对象 根据构造函数的情况&#xff0c;来确定是否可以接受参数的传递…

电车降价,不如腾讯云服务器价格降得多,61元一年服不服?

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

寒假作业Day 02

这是第二天的作业&#xff0c;fighting&#xff01; Day 02 一、选择题 首先char* s[6]是指针数组&#xff0c;也就是其存储的都是这些字符串的地址&#xff0c;其实际上的类型为char**&#xff0c;而fun函数传入了s数组的首地址。而后续fun函数中打印字符&#xff0c;p[i]即…

ShardingSphere 5.x 系列【18】自定义类分片算法

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. ClassBasedShardingAlgorithm3. 案例演示3.1 STANDARD3.2 COMPLEX…

逆变器专题(16)-构网型逆变器与跟网型逆变器

相应仿真原件请移步资源下载 现如今&#xff0c;常规的逆变器控制方法主要分为跟网型以及构网型逆变器 跟网型逆变器即常规意义上的并网逆变器&#xff0c;即输出电流直接接入大电网&#xff0c;通常为电流源型逆变器&#xff0c;其输出电流的相位与频率时随着电网电压而随时进…

幸运星数(爷再也不想用pow了)

解法&#xff1a; 暴力 #include <iostream> #include <vector> using namespace std; #define endl \nint main() {ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int n;long long sum 0, a;cin >> n;for (int i 1; i < n; i) {a 1;for (in…

springboot+vue实现oss文件存储

前提oss准备工作 进入阿里云官网&#xff1a;阿里云oss官网 注册 搜OSS&#xff0c;点击“对象存储OSS” 第一次进入需要开通&#xff0c;直接点击立即开通&#xff0c;到右上角AccessKey管理中创建AccessKey&#xff0c;并且记住自己的accessKeyId和accessKeySecret&#…

CentOS 7开启Web服务

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

靶机渗透之My File Server: 1

Name: My File Server: 1Date release: 21 Feb 2020Author: Akanksha Sachin VermaSeries: My File ServerDownload: https://drive.google.com/uc?id1w0grAomPuFaIohBcUwDiI3QIi4fj4kje&exportdownload 对于vulnhub中的靶机&#xff0c;我们都需先下载镜像&#xff0c;然…

5个顶级AI训练数据提供商

人工智能革命极大地改变了世界&#xff0c;其影响遍及全球各个行业。 它改变了企业的典型运营方式&#xff0c;从而显着提高了生产力。 大多数公司已经使用或正在考虑某种形式的人工智能。 但为了让机器获得准确的结果&#xff0c;需要可以输入机器学习算法的高质量标记数据。…

云计算 3月1号 (文件管理及root破解登录和防御)

一、文件查找与打包压缩 grep: 文件内容过滤 [rootqfedu.com ~]# grep root /etc/passwd #从/etc/passwd文件中过滤root字段 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [rootqfedu.com ~]# grep ^root /etc/passwd #从/etc/passwd文件…

NC65 零预算控制规则 数据库表关系

NC65 零预算控制规则 数据库表关系 SELECT t1.createdby, t1.objname, t2.ctrlname, t2.pk_parent, t3.billtype, t3.nameidx, t3.pk_obj FROM tb_rule_formula t1 left join tb_ctrlformula t2 on t1.pk_obj t2.pk_parent left join tb_ctrlscheme t3 on t3.pk_ctrlformula …

安泰ATA-2048电压放大器在超声清洗中的应用有哪些

超声清洗是一种高效的清洗技术&#xff0c;广泛应用于各个领域&#xff0c;包括工业制造、医疗设备、实验室和家用清洗。电压放大器在超声清洗中扮演着关键的角色&#xff0c;它们用于产生和控制超声波信号&#xff0c;从而实现快速而有效的清洗过程。下面安泰电子将详细介绍电…

JAVASE初认识

1.初认识其结构 1.源文件&#xff08;扩展名为*.java)&#xff1a;源文件带有类的定义。类用来表示程序的一个组件&#xff0c;小程序或许只会有一个类。类的内容必须包含在花括号里面。 2.类&#xff1a;类中带有一个或多个方法。方法必须在类的内部声明。 3.方法&#xff1…