python 笔记(2)——文件、异常、面向对象、装饰器、json

news2024/11/16 13:02:46

目录

1、文件操作

1-1)打开文件的两种方式:

1-2)文件操作的简单示例: 

write方法:

read方法:

readline方法:

readlines方法:

2、异常处理

 2-1)不会中断程序的异常捕获和处理

2-2)中断程序的异常捕获和处理 raise

2-3)对操作文件的异常处理:

3、面向对象

4、闭包

5、装饰器(函数装饰器)

6、关于JSON的数据操作

6-1)dumps 方法

6-2)loads方法

6-3)dump方法

6-4)load 方法


1、文件操作

打开模式(mode)描述
b二进制模式。
+打开一个文件进行更新(可读可写)。
r只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除如果该文件不存在,创建新文件
wb二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除如果该文件不存在,创建新文件
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除如果该文件不存在,创建新文件
wb+二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后如果该文件不存在,创建新文件进行写入。
ab二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写
ab+二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

参考自:https://www.runoob.com/python3/python3-file-methods.html 

1-1)打开文件的两种方式:

# 打开指定的文件,默认以读的方式打开,并指定编码的格式为utf-8
f = open('./test.txt','r', encoding = 'utf-8')

# 读取所有的内容
content = f.read()

# 输出内容
print(content)

# 使用完时手动关闭文件
f.close()
# 使用 with 自动处理资源关闭
with open('test.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    # 到 with 缩进内容的最后,文件会被关闭
print(content)          # 执行这句前,文件已被关闭

 

1-2)文件操作的简单示例: 

test.txt
昨天是星期一,天气晴朗,我很开心;
今天是星期二,下了大雨,我很难过;
明天是星期三,听说还是要下大雨,我觉得我不会开心;
后天是星期四,不知道会怎么样呢;
永远相信美好的事情即将发生!
 
write方法:
# 'a' 用于追加,文件指针放到文件内容的结尾
f = open('test.txt', 'a', encoding = 'utf-8')

# 换行追加指定的内容
f.write("\n Hello. goodbye!")

f.close()
昨天是星期一,天气晴朗,我很开心;
今天是星期二,下了大雨,我很难过;
明天是星期三,听说还是要下大雨,我觉得我不会开心;
后天是星期四,不知道会怎么样呢;
永远相信美好的事情即将发生!
 Hello. goodbye!
 
read方法:
# 读取 指定读取的长度
f = open('test.txt', 'r', encoding='utf-8')
content = f.read(10)              # 读取前10个字符,如果没有指定,则是读入全部内容
print(list)
f.close()

with open('test.txt', 'r', encoding='utf8') as f:
    res = f.read(3)      # 默认读取第一行的内容,读取前3个字符
    print(res)
    res = f.read(3)      # 接着读入后面3个字符
    print(res)

 readline方法:
with open('test.txt', 'r', encoding='utf8') as f:
    res = f.readline()      # 默认读取第一行的内容,包括最后的换行符
    print(res)
    res = f.readline()      # 读取第二行的内容,包括最后的换行符
    print(res)


readlines方法:
with open('test.txt', 'r', encoding='utf-8') as f:
    line = f.readlines()        # 返回一个列表,其中的每一个元素是每一行的内容,包括最后的换行符
    print(line)

2、异常处理

 2-1)不会中断程序的异常捕获和处理

num_1 = 10
num_2 = 0

try:
    res = num_1 / num_2
    print(res)          # 不会执行
except:
    print('除数不能为0')     # 执行
finally:
    print('finally')       # 放到 finally中的内容最后无论如何都会执行

print(1 + 3)               # 会继续往下执行,程序不会中断

 

try:
    res = num_1 / num_2
    print(res)          # 不会执行
except Exception as e:      # 捕获所有 Exception 类中已定义的错误
    print(e)            # division by zero
finally:
    print('finally')    # 执行

print(1 + 2)            # 会继续执行

2-2)中断程序的异常捕获和处理 raise

try:
    res = num_1 / num_2
    print(res)          # 不会执行
except Exception as e:
    print(e)            # division by zero
    raise Exception('除数不能为0')       # 抛出异常,并提示 除数不能为0
finally:
    print('finally')

print(1 + 2)            # 不会执行,程序会中断

try:
    res = num_1 / num_2
    print(res)          # 不会执行
except ZeroDivisionError as e1:          # 逐层捕获错误
    print(e1)            # division by zero
    raise ZeroDivisionError('除数不能为0')   # 抛出错误并自定义提示内容
except Exception as e2:                  # Exception 是所有异常类的父类,应该放在最后
    print(e2)
    raise               # 抛出错误并给出对应的默认提示
finally:
    print('finally')

print(1 + 2)            # 不会执行

2-3)对操作文件的异常处理:

try:
    with open('../Normal/test.txt', 'r', encoding='utf-8') as f:
        res = f.read()
except FileNotFoundError as e:      # 文件不存在时的错误
    raise FileNotFoundError('文件不存在')
except Exception as e:              # 其他错误
    raise Exception('发生错误')
else:                   # 没有异常时执行
    print(res)

 

3、面向对象

class People:
    # 定义类属性
    type = '哺乳动物'

    # 定义私有属性 双下划线开头
    __private = ''

    # 定义构造方法 实例化时会自动调用,并且可以将实例变量或实例属性在此定义
    # self 形参属于类实例的引用,与其他语言中的 this 中的关键字类似
    # 类方法的第一个形参一定是 self (可以用其他的名称),代表实例本身
    def __init__(self, name = '', age = '', gender = ''):
        # 定义实例属性
        self.name = name
        self.age = age
        self.gender = gender

    # 用于释放实例空间,释放内存空间   程序结束后会自动调用,可以处理收尾工作
    def __del__(self):
        print('正在释放实例空间')

    # 打印类的实例使会触发的方法, 相当于 java 中的 toString;下面的操作是重写
    def __str__(self):
        return f'当前类的实例正在被打印'

    # 受保护的方法    子类可以继承
    def _protectFunc(self):
        print('这是一个受保护的方法')

    # 私有的方法     子类不能继承
    def __privateFunc(self):
        print('这是一个私有的方法')

    # 定义三个方法
    def talk(self, str):
        print(f'{self.name}: {str}.')

    def doing(self, str):
        print(f'{self.name}正在{str}.')

    def info(self):
        print(f'name: {self.name},age: {self.age}, gender: {self.gender}')

    # 定义类的静态方法,直接使用类名调用
    @classmethod
    def people_type(cls):       # cls 代表类本身
        print(cls.type)
# 新建一个Man类,继承于 People 类
class Man(People):
    # 重写父类的方法
    def talk(self, str):
        print('子类重写了父类的talk方法')

    # 拓展自己的新方法
    def eat(self):
        print('子类自己的方法 eat')
# 如果执行者是当前文件自身,则会执行以下的内容;被其他的模块导入时,不会执行下面的内容
if __name__ == '__main__':
    # p1 = People()           # 类的实例化,会自动调用构造方法
    # p1.name = '张三'          # 先找实例变量,在找类变量
    # p1.age = 14
    #
    # p2 = People()
    #
    # print(id(p1), id(p2))    # 两个不同的虚拟地址


    # p3 = People('张三', 23, '男')
    # # print(p3)
    # print(p3.name)
    #
    # People.people_type()        # 使用 类名.静态方法 调用类的静态方法(推荐)


    man = Man()
    man._protectFunc()          # 子类可以调用父类受保护的方法,不能调用父类私有的方法

4、闭包

        在一个函数中定义了一个内部函数,并且该内部函数使用了外部函数的参数或变量,则称为闭包。

def outer(x, y):
    z = x * y
    y = 20
    def inner(a = 0):
        return a + x + y + z
    return inner

# 由外部函数到内部函数依次传参
res = outer(2, 3)(4)        # 4 + 2 + 20 + 6
print(res)

res = outer(2, 3)()         # 0 + 2 + 20 + 6
print(res)

5、装饰器(函数装饰器)

        上面面向对象中,People类定义静态方法 people_type 的上一行:@classmethod 就是一个装饰器。

        装饰器本身也是一个函数,装饰器给其他的函数使用,可以改变程序执行的顺序。

'''
定义装饰器,用于统计函数的运行时间
函数里面定义了一个函数,称之为内部函数(闭包)
装饰器自带一个参数 —— func,用于获取被装饰函数的地址
内部函数运行结束后,必须要返回其函数名(地址)
'''
def stat(func):             # 装饰器,接收到的第一个参数是要使用该装饰器的函数的地址(函数名)
    def inner():
        start = time.time()
        print('当前时间为:', start)
        func()              # 执行该函数
        end = time.time()
        print('结束时间为:', end)
        print('总用时:', end - start)
    return inner


@stat       # 表示 test2 函数使用 stat 装饰器
def test2():
    result = 99999
    for i in range(100000):
        result = result - i ** 2
    print("result = ",result)

test2()             # 如果该函数有装饰器,则会直接去执行装饰器

def decorate(func):
    def inner(*args, **kwargs):
        print('###',args, kwargs)
        func(*args, **kwargs)
        print('finally')
    return inner

@decorate
def test(name, age):
    print(f'Hello,{name}.your age is {age}.')


test('张三', age=18)

在这里, test('张三',age=18) 相当于调用了 装饰器里的 inner('张三',age=18)

装饰器的内部函数接收到的参数就是传递给test的参数,第四行时,执行了 test 函数。

6、关于JSON的数据操作

sourceObj = [
    {'name': 'Tom', 'age': 15, 'gender': 'man', 'num': 1001},
    {'name': 'ben', 'age': 14, 'gender': 'woman', 'num': 1002},
    {'name': 'jam', 'age': 15, 'gender': 'woman', 'num': 1003},
    {'name': 'jack', 'age': 16, 'gender': 'man', 'num': 1004},
]
sourceStr = ('[{"name": "Tom", "age": 15, "gender": "man", "num": 1001}, '
             '{"name": "ben", "age": 14, "gender": "woman", "num": 1002}, '
             '{"name": "jam", "age": 15, "gender": "woman", "num": 1003}, '
             '{"name": "jack", "age": 16, "gender": "man", "num": 1004}]')
import json

6-1)dumps 方法

         将 json 对象(python字典)转换成 json 字符串。单引号会转换成双引号。

import json
jsonstr = json.dumps(sourceObj)        # 使用 dumps 方法将其转换成 json 字符串
print(type(jsonstr))
print(jsonstr)              # 单引号会变成双引号

6-2)loads方法

        将 json 字符串转成 json 对象(Python字典)

jsonObj = json.loads(sourceStr)         # 将 json 格式的字符串转成对象列表的形式
print(jsonObj[0]['name'])               # Tom

6-3)dump方法

         将 json 对象格式的内容以 json 对象写出到指定文件

with open('./jsonString.json','w', encoding='utf-8') as f:
    json.dump(json.loads(sourceStr), f)         # 将json对象格式的内容写出

 

6-4)load 方法

         将json对象文件中的内容以字典列表的形式读入

with open('./jsonString.json', 'r') as f:
    res = json.load(f)
    print(res[0]['name'])           # Tom
    print(type(res))                # <class 'list'>

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

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

相关文章

在CentOS7中,安装并配置Redis【个人笔记】

一、拓展——Ubuntu上安装Redis 输入命令su --->切换到root用户【如果已经是&#xff0c;则不需要进行该操作】apt search redis --->使用apt命令来搜索redis相关的软件包【查询后&#xff0c;检查redis版本是否是你需要的&#xff0c;如果不是则需要看看其他资料~】ap…

QT可执行程序打包成安装程序

目录 1.将QT程序先放到一个文件中 2.下载QtInstallerFramework-win-x86.exe 3.将setup.exe单独拷贝出来&#xff0c;进行安装测试 4.测试安装后的程序是否可执行 1.将QT程序先放到一个文件中 &#xff08;1&#xff09;QT切换到release模式&#xff0c;编译后在构建目录生…

YOLOv5、YOLOv8改进:gnconv 门控递归卷积

1.简介 论文地址&#xff1a;https://arxiv.org/abs/2207.14284 代码地址&#xff1a;https://github.com/raoyongming/HorNet 视觉Transformer的最新进展表明&#xff0c;在基于点积自注意力的新空间建模机制驱动的各种任务中取得了巨大成功。在本文中&#xff0c;作者证明了…

【进程间通信】IPC对象(进程间通信的精髓)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

2023年8月随笔之有顾忌了

1. 回头看 日更坚持了243天。 读《发布&#xff01;设计与部署稳定的分布式系统》终于更新完成 选读《SQL经典实例》也更新完成 读《高性能MySQL&#xff08;第4版&#xff09;》开更&#xff0c;但目前暂缓 读《SQL学习指南&#xff08;第3版&#xff09;》开更并持续更新…

3、QT 的基础控件的使用

一、qFileDialog 文件窗体 Header: #include <QFileDialog> qmake: QT widgets Inherits: QDialog静态函数接口&#xff1a; void Widget::on_pushButton_clicked() {//获取单个文件的路径名QString filename QFileDialog :: getOpenFileName(this, tr("Open Fi…

【taro react】(游戏) ---- 贪吃蛇

1. 预览 2. 实现思路 实现食物类&#xff0c;食物坐标和刷新食物的位置&#xff0c;以及获取食物的坐标点&#xff1b;实现计分面板类&#xff0c;实现吃食物每次的计分以及积累一定程度的等级&#xff0c;实现等级和分数的增加&#xff1b;实现蛇类&#xff0c;蛇类分为蛇头和…

16 Linux之JavaEE定制篇-搭建JavaEE环境

16 Linux之JavaEE定制篇-搭建JavaEE环境 文章目录 16 Linux之JavaEE定制篇-搭建JavaEE环境16.1 概述16.2 安装JDK16.3 安装tomcat16.4 安装idea2020*16.5 安装mysql5.7 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能会用到的资料有如下所示&#xff0…

Matlab图像处理-灰度插值法

最近邻法 最近邻法是一种最简单的插值算法&#xff0c;输出像素的值为输入图像中与其最邻近的采样点的像素值。是将(u0,v0)(u_0,v_0)点最近的整数坐标u,v(u,v)点的灰度值取为(u0,v0)(u_0,v_0)点的灰度值。 在(u0,v0)(u_0,v_0)点各相邻像素间灰度变化较小时&#xff0c;这种方…

使用ELK收集解析nginx日志和kibana可视化仪表盘

文章目录 ELK生产环境配置filebeat 配置logstash 配置 kibana仪表盘配置配置nginx转发ES和kibanaELK设置账号和密码 ELK生产环境配置 ELK收集nginx日志有多种方案&#xff0c;一般比较常见的做法是在生产环境服务器搭建filebeat 收集nginx的文件日志并写入到队列&#xff08;k…

图解 STP

网络环路 现在我们的生活已经离不开网络&#xff0c;如果我家断网&#xff0c;我会抱怨这什么破网络&#xff0c;影响到我刷抖音、打游戏&#xff1b;如果公司断网&#xff0c;那老板估计会骂娘&#xff0c;因为会影响到公司正常运转&#xff0c;直接造成经济损失。网络通信中&…

传统分拣弊端明显,AI机器视觉赋能物流行业包裹分类产线数智化升级

随着电子商务的快速发展&#xff0c;物流行业的包裹数量持续增长&#xff0c;给物流企业带来了巨大的运营压力。目前&#xff0c;国内大型物流运转中心已开始采用机器视觉自动化设备&#xff0c;但多数快递公司处于半自动化状态&#xff0c;中小型物流分拣中心目前仍靠人工录入…

iOS系统修复软件 Fix My iPhone for Mac

Fix My iPhone for Mac是一款iOS系统恢复工具。修复您的iPhone卡在Apple徽标&#xff0c;黑屏&#xff0c;冻结屏幕&#xff0c;iTunes更新/还原错误和超过20个iOS 12升级失败。这个macOS桌面应用程序提供快速&#xff0c;即时的解决方案来修复您的iOS系统问题&#xff0c;而不…

基于单片机的遥控器设计

一、项目介绍 随着科技的不断发展&#xff0c;红外遥控器已经成为我们日常生活中普遍使用的一种电子设备。它能够给我们带来便捷和舒适&#xff0c;减少人工操作的繁琐性。然而&#xff0c;在实际应用中&#xff0c;有时候我们可能需要制作一个自己的红外遥控器&#xff0c;以…

【云原生进阶之PaaS中间件】第一章Redis-2.4缓存更新机制

1 缓存和数据库的数据一致性分析 1.1 Redis 中如何保证缓存和数据库双写时的数据一致性&#xff1f; 无论先操作db还是cache&#xff0c;都会有各自的问题&#xff0c;根本原因是cache和db的更新不是一个原子操作&#xff0c;因此总会有不一致的问题。想要彻底解决这种问题必须…

目标检测YOLO算法,先从yolov1开始

学习资源 有一套配套的学习资料&#xff0c;才能让我们的学习事半功倍。 yolov1论文原址&#xff1a;You Only Look Once: Unified, Real-Time Object Detection 代码地址&#xff1a;darknet: Convolutional Neural Networks (github.com) 深度学习经典检测方法 one-stag…

React 18 对 state 进行保留和重置

参考文章 对 state 进行保留和重置 各个组件的 state 是各自独立的。根据组件在 UI 树中的位置&#xff0c;React 可以跟踪哪些 state 属于哪个组件。可以控制在重新渲染过程中何时对 state 进行保留和重置。 UI 树 浏览器使用许多树形结构来为 UI 建立模型。DOM 用于表示 …

3DCAT携手华为,打造XR虚拟仿真实训实时云渲染解决方案

2023年5月8日-9日&#xff0c;以 因聚而生 众志有为 为主题的 华为中国合作伙伴大会2023 在深圳国际会展中心隆重举行。本次大会汇聚了ICT产业界的广大新老伙伴朋友&#xff0c;共同探讨数字化转型的新机遇&#xff0c;共享数字化未来的新成果。 华为中国合作伙伴大会2023现场&…

Python小知识 - 使用Python进行数据分析

使用Python进行数据分析 数据分析简介 数据分析&#xff0c;又称为信息分析&#xff0c;是指对数据进行综合处理、归纳提炼、概括总结的过程&#xff0c;是数据处理的第一步。 数据分析的目的是了解数据的内在规律&#xff0c;为数据挖掘&#xff0c;并应用于商业决策、科学研究…

04ShardingSphere-JDBC垂直分片

1、准备服务器 比如商城项目中&#xff0c;有用户、订单等系统&#xff0c;数据库在设计时用户信息与订单信息在同一表中。这里创建用户服务、订单服务实现数据库的用户信息和订单信息垂直分片 服务器规划&#xff1a;使用docker方式创建如下容器 服务器&#xff1a;容器名se…