当前位置: 首页 > news >正文

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

目录

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 = 0try:res = num_1 / num_2print(res)          # 不会执行
except:print('除数不能为0')     # 执行
finally:print('finally')       # 放到 finally中的内容最后无论如何都会执行print(1 + 3)               # 会继续往下执行,程序不会中断

 

try:res = num_1 / num_2print(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_2print(res)          # 不会执行
except Exception as e:print(e)            # division by zeroraise Exception('除数不能为0')       # 抛出异常,并提示 除数不能为0
finally:print('finally')print(1 + 2)            # 不会执行,程序会中断

try:res = num_1 / num_2print(res)          # 不会执行
except ZeroDivisionError as e1:          # 逐层捕获错误print(e1)            # division by zeroraise 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 = nameself.age = ageself.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}')# 定义类的静态方法,直接使用类名调用@classmethoddef 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 * yy = 20def inner(a = 0):return a + x + y + zreturn 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 = 99999for i in range(100000):result = result - i ** 2print("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'])           # Tomprint(type(res))                # <class 'list'>

相关文章:

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

目录 1、文件操作 1-1&#xff09;打开文件的两种方式&#xff1a; 1-2&#xff09;文件操作的简单示例&#xff1a; write方法: read方法&#xff1a; readline方法&#xff1a; readlines方法&#xff1a; 2、异常处理 2-1&#xff09;不会中断程序的异常捕获和处理…...

Meta AI的Nougat能够将数学表达式从PDF文件转换为机器可读文本

大多数科学知识通常以可移植文档格式&#xff08;PDF&#xff09;的形式存储&#xff0c;这也是互联网上第二突出的数据格式。然而&#xff0c;从这种格式中提取信息或将其转换为机器可读的文本具有挑战性&#xff0c;尤其是在涉及数学表达式时。 为了解决这个问题&#xff0c…...

【Python爬虫笔记】爬虫代理IP与访问控制

一、前言 在进行网络爬虫的开发过程中&#xff0c;有许多限制因素阻碍着爬虫程序的正常运行&#xff0c;其中最主要的一点就是反爬虫机制。为了防止爬虫程序在短时间内大量地请求同一个网站&#xff0c;网站管理者会使用一些方式进行限制。这时候&#xff0c;代理IP就是解决方…...

50、Spring WebFlux 的 自动配置 的一些介绍,与 Spring MVC 的一些对比

Spring WebFlux Spring WebFlux 简称 WebFlux &#xff0c;是 spring5.0 新引入的一个框架。 SpringBoot 同样为 WebFlux 提供了自动配置。 Spring WebFlux 和 Spring MVC 是属于竞争关系&#xff0c;都是框架。在一个项目中两个也可以同时存在。 SpringMVC 是基于 Servlet A…...

【算法专题突破】双指针 - 和为s的两个数字(6)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;剑指 Offer 57. 和为s的两个数字 - 力扣&#xff08;Leetcode&#xff09; 这道题题目就一句话但是也是有信息可以提取的&#xff0c; 最重要的就是开始的那句话&#…...

Redis7入门概述

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…...

SQL sever命名规范

目录 一、标识符 二、表名&#xff08;Table&#xff09;: 三、字段名&#xff08;fields&#xff09;&#xff1a; 四、约束&#xff08;Constraint&#xff09;&#xff1a; 五、索引&#xff08;Index&#xff09;&#xff1a; 六、存储过程&#xff08;Stored Proced…...

BCSP-玄子Share-Java框基础_工厂模式/代理模式

三、设计模式 3.1 设计模式简介 软件设计中的三十六计是人们在长期的软件开发中的经验总结是对某些特定问题的经过实践检验的特定解决方法被广泛运用在 Java 框架技术中 3.1.1 设计模式的优点 设计模式是可复用的面向对象软件的基础可以更加简单方便地复用成功的设计和体系…...

【数据结构】2015统考真题 6

题目描述 【2015统考真题】求下面的带权图的最小&#xff08;代价&#xff09;生成树时&#xff0c;可能是Kruskal算法第2次选中但不是Prim算法&#xff08;从v4开始&#xff09;第2次选中的边是&#xff08;C&#xff09; A. (V1, V3) B. (V1, V4) C. (V2, V3) D. (V3, V4) …...

HTML <track> 标签

实例 播放带有字幕的视频: <video width="320" height="240" controls="controls"><source src="forrest_gump.mp4" type="video/mp4" /><source src="forrest_gump.ogg" type="video/ogg…...

php中识别url被篡改并阻止访问的实现方式是什么

在 PHP 中&#xff0c;可以通过多种方式来识别并阻止 URL 被篡改的访问。以下是一些常见的方法&#xff1a; 基本身份验证&#xff1a;使用 PHP 的 $_SERVER[PHP_AUTH_USER] 和 $_SERVER[PHP_AUTH_PW] 变量可以实施基本的 HTTP 身份验证。在访问受保护的页面之前&#xff0c;可…...

c++ 学习 之 const,constexpr,volatile

前言 const、constexpr 和 volatile 是 C 中用于修饰变量和类型的关键字 正文 它们分别用于不同的用途&#xff1a; const&#xff08;常量&#xff09;&#xff1a; const 用于声明常量&#xff0c;表示变量的值不能被修改。 它可以应用于变量、指针、引用、成员函数以及类…...

【Flink】关于jvm元空间溢出,mysql binlog冲突的问题解决

问题一&#xff1a;7张表是同一个mysql中的&#xff0c;我们进行增量同步时分别用不同的flink任务读取&#xff0c;造成mysql server-id冲突问题&#xff0c;如下&#xff1a; Caused by: io.debezium.DebeziumException: A slave with the same server_uuid/server_id as this…...

C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)

using System; using System.Threading; using System.Windows.Forms; using UtilForm.Util;namespace UtilForm {// 线程同步&#xff0c;事件触发&#xff0c;信号量&#xff0c;互斥锁&#xff0c;共享内存&#xff0c;消息队列public partial class frmUIThread : Form{ Sy…...

OpenWrt系统开发笔记

openWrt英文官网&#xff1a; https://openwrt.org/ 中文官网&#xff1a; http://www.openwrt.org.cn/ 一、开发环境及编译 在github上有两个源码使用的比较多   一个是lede,地址为&#xff1a;https://github.com/coolsnowwolf/lede   另一个为OpenWrt的官方源码&#…...

实战 - Restful APi 格式规范

文章目录 1. 特征2. 优点3. 动作1. GET 获取资源2. POST 创建资源3. PUT 整体替换4. PATCH 部分替换5. DELETE 删除资源 4. 示例 RESTful是一种API的设计风格&#xff0c;他和GraphQL &#xff0c;JSON-RPC&#xff0c;WebService类似&#xff0c;用于定义在CS、BS架构下暴露服…...

《Linux从练气到飞升》No.21 Linux简单实现一个shell

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…...

【iVX】iVX的低代码未来发展趋势:加速应用开发的创新之路

简介&#xff1a; 随着数字化转型的飞速发展&#xff0c;企业和组织对快速开发和交付高质量应用的需求越来越迫切。低代码开发平台作为一种创新的解决方案&#xff0c;极大地简化了应用程序的开发过程。在这一领域&#xff0c;iVX低代码平台作为领先的创业公司&#xff0c;正在…...

zookee 安装

1、下载安装包 weget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz 方案1&#xff1a;wget是一个下载指令&#xff0c;后面可以跟下载连接去从服务器上下载东西。 方案2&#xff1a;也可以先下载到windows上&#xff0c;再通…...

OpenWrt编译自己的应用程序

编译OpenWrt的应用程序可以参考OpenWrt内部其他应用程序的例程&#xff0c;来编写成自己的应用程序 一、OpenWrt源代码获取与编译 1.1、搭建环境 下载OpenWrt的官方源码&#xff1a; git clone https://github.com/openwrt/openwrt.git1.2、安装编译依赖项 sudo apt update…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...