当前位置: 首页 > 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…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...