python学习笔记(13)---(IO对象序列化)面向对象

news2024/12/22 20:58:26

目录

面向对象---第十一章  IO对象序列化

1.IO流(IO stream)

2.open()方法

3.写入方法:write()

4.对象序列化


面向对象---第十一章  IO对象序列化

1.IO流(IO stream)

(1)概述:在本地进行文件存储,形成持久化的读写数据的能力

(2)IO流

  • IO流:输入输出流,指一种将数据从读入内存和从内存中输出的技术
  • 作用:持久化数据,保证数据不再丢失

(3)流的分类

  • 字节流(b):字节处理,可以操作一切数据,如:音频、图片、可执行文件、字节流操作大数据时,不建议一次性读取
  • 字符流(t):字符只操作UTF-8的字符数据,一般不用考虑存储空间不够用的问题(500w字-10MB)

2.open()方法

(1)过程:

(2)缓冲区(buffer)

1)缓冲区是内存的一部分,在内存中预留了一定存储空间,该空间用于缓冲输入或输出

使用缓冲区的必要性:由于内存的I/O速度远远大于外设的I/O速度,同步读写时会造成内存长时间等待,浪费性能;可能会造成数据溢出或淹没

2)缓冲区分类:

  • 全缓冲:填满标准I/O缓冲区才会进行实际的传输操作,硬盘的文件默认使用全缓冲
  • 行缓冲:当输入输出遇到换行符时就会缓冲
  • 无缓冲:用户不提供缓冲,对数据流立即进行读写操作

(3)格式f = open(filename,mode,encoding)

  • open()方法返回值是一个file对象,可以赋值给一个变量(文件句柄)
  • filename:文件名,是一个字符串,包含路径
  • encoding:编码格式,一般为utf-8
  • mode:打开文件方式

(4)b模式

1)概述:二进制模式:一般用于读取图片、视频等二进制文件

PS:b模式是以byte类型读取文件,返回的byte对象不是字符串,必须指定编码格式,输入的类型必须保证为byte类型

例:

s = 'this is a test'
b = bytes(s, encoding='utf-8')
f = open('test.txt', 'wb')
f.write(b)
f.close()
# 打开方式为wb,写入s串会报错

(5)+模式:

  • 对于w+模式,在读写之前后会清空原有数据,建议不要使用
  • 对于a+模式,永远的只会在文件的尾部写入,有局限性,不建议使用
  • 对于r+模式,也就是读写结合模式,配合seek()和tell()方法实现更多操作

(6)文件对象的操作:

  • read(size):读取一定大小的数据,然后作为字符串或字节对象返回,size为可选参数,用于指定读数的数据流,size忽略或为负数表示该文件所有内容都将被读取并返回
f = open('test.txt', 'r')
str1 = f.read(7)
print(str1)
f.close()
# 若文件体积较大,可以分多次读取,使用read(512)方法一点点读取
  • readline():从文件中读取一行或多行内容,换行为\n,若读到最后一行则返回空串,用于读一行处理一行,不能回头
f = open('test.txt', 'r')
str1 = f.readline()
print(str1)
f.close()
  • readlines():将文件所有行,一行一行全部读入到多个列表中,按顺序存储到列表中,返回一个列表
f = open('test.txt', 'r')
str1 = f.readlines()
print(str1)
f.close()
# ['this is a test']

(7)遍历文件

  • 实际上可以将文件对象作为一个迭代器使用
f = open('test.txt', 'r')
for i in f:
    print(i,end=' ')
f.close()
# this is a test

小结:几种不同的读取文件的方法,若文件容量小使用read()一次性读取较为方便,若不能确定文件大小则可以使用read(size)反复测试,若是配置文件可以使用readlines()较为方便或者for循环遍历

3.写入方法:write()

  • 作用:将字符串或字节数据写入文件
  • write()多次操作实际是在内存中完成,并不会立即写入磁盘,只有close()后操作同步到磁盘
  • 格式:文件对象.write(‘内容’)

(1)tell():返回文件读写指针的位置,从文件开头算起的字节数

(2)seek():移动若干个字符到指定位置,如:seek(x,1)表示从当前位置开始向后移动x个字符。seek(-x,2)从结尾开始向前移动

f = open('test.txt', 'rb+')
f.write(b'123456789')
f.tell()

print(f.seek(2,2))
print(f.seek(3,1))
f.close()
# (x,数字),数字有0,1,2, 0表示从文件开头算起,1表示从文件读写指针的位置来时算起,2表示从文件的结尾算起,默认为0 

(3)close():关闭文件对象,处理完一个文件后,关闭文件并释放资源,则关闭若再次尝试读写操作将会抛出异常,若忘记调用close(),则后果可能数据只会写入一部分,剩余数据会丢失。

4.对象序列化

(1)什么是对象的序列化?

对容器等对象这种抽象的概念转化为真正存储的字符或字节数据的过程。

(2)产生的原因:

  • 便于存储:序列化的本质就是将文本信息转为二进制数据流,python中运行的数据。如:序列,字符串元组等要是想永久保存,方便以后使用,必须进行序列化。
  • 便于传输:当两个进程进行远距离通信时,彼此可以发送各个类型的数据,无论何种类型数据都会以二进制序列进行传输,接收方收到后进行反序列化,转为可以是识别的字符集恢复为对象。

(3)pickle模块

  • 作用:通过pickle模块的序列化操作可以将运行的对象信息存储到文件中,永久保存,通过pickle反序列化操作可以从文件中回复对象
  • 常用方法:dump  dumps  load  loads

# dumps 序列化为字节数据
import pickle
list1 = [10, 20, 30, 40, 50]
data1 = pickle.dumps(list1)
print(data1)
# b'\x80\x04\x95\x0f\x00\x00\x00\x00\x00\x00\x00]\x94(K\nK\x14K\x1eK(K2e.'
f = open('test2.txt', 'wb')
f.write(data1)
f.close()  
# loads 进行反序列化
import pickle
f = open('test2.txt', 'rb')
show = f.read()
show = pickle.loads(show)
print(show)
f.close()
# [10, 20, 30, 40, 50]

例:将字符串序列化存储到test3.txt中,读取后反序列化输出

# dump
import pickle

str1 = ['china', 'world', 'hello', '1234567']
pickle.dump(str1, open('test3.txt', 'wb'))
f = open('test3.txt', 'rb')
print(f.read())
f.close()

# load
str2 = pickle.load(open('test3.txt', 'rb'))
print(str2)

(4)json模块

  • 作用:json模块将对象序列号转化为字符数据,方法同上。

PS:json一般用于处理字典类型数据

import json
data1 = {'username': '杨勇', 'age': '17', 'number': '33'}
print(json.dumps(data1))
data2 = json.dumps(data1)
f = open('test4.txt', 'wt')
f.write(data2)
f.close()
# {"username": "\u6768\u52c7", "age": "17", "number": "33"}
# PS:注意文件打开方式为wt,字符形式

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

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

相关文章

编译原理实验三:算符优先分析算法的设计与实现

实验三 算符优先分析算法的设计与实现 一、 实验目的 根据算符优先分析法,对表达式进行语法分析,使其能够判断一个表达式是否正确。通过算符优先分析方法的实现,加深对自下而上语法分析方法的理解。 二、 实验要求 1、输入文法。可以是如下…

Java 图片上传后为什么会自动旋转90度?

问题: 用户反馈上传后的图片方向不对,起初怀疑是本身图片方向有问题,但是用windows图片查看器打开图片方向是"正常"显示的? 分析: windows默认的图片查看器已经帮我们自动旋转展示了,我们在手机横拍或者扫…

【Vue核心】7.事件处理

事件处理的基本使用 绑定监听 v-on:xxx“fun” xxx“fun” xxx“fun(参数)” 默认事件形参: event 隐含属性对象: $event 绑定方法说明 使用v-on:xxx 或xxx绑定事件,其中xxx是事件名;事件的回调需要配置在methods对象中,最终公在vm上;methods中配置的函数,不要用箭头函…

python 调试IGH库

如何通过python来调试IGH的库呢? 可以使用如下的代码,测试请求主站,把主站变成激活状态。其他的函数也可以类似的一步一步调用。 结果如下: from ctypes import * ighCDLL("/home/cheni/lichuan_bujin/libethercat.so&quo…

开传奇大概需要什么条件

《热血传奇》是盛趣游戏2001年推出的一款大型多人在线角色扮演游戏(MMORPG)。 该游戏具有战士、魔法师和道士三种职业,所有情节的发生、经验值取得以及各种打猎、采矿等活动都是在网络上即时发生。 《热血传奇》包括白天、黑夜、贸易、物品等…

c++多模块化划分算法MMM(单链接、全链接、均链接)

文章目录题目1c代码一、实验目的二、实验描述3.1 题目13.1.1 单链接3.1.2 全链接3.1.3 均值链接3.1.4 划分结果统计&#xff1a;3.2 题目23.2.1 单链接3.2.2 全链接3.2.3 均值链接3.2.4 划分结果统计&#xff1a;题目2c代码github地址 代码地址 题目1c代码 #include<cstdi…

关于Servlet编程(2)

1.常用类的关键API介绍 Servlet中常见的类有三个.介绍过了HttpServlet类.我们再来看看另外两个. HttpServletRequest 这个类对应到发送的HTTP请求. 方法描述String getProtocol()返回请求协议的名称和版本String getMethod()返回请求的 HTTP 方法的名称 (GET,POST 或 PUT)S…

java计算机毕业设计ssm医院病人信息管理系统60k18(附源码、数据库)

java计算机毕业设计ssm医院病人信息管理系统60k18&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

summernote富文本编辑器和jquery.validate冲突报错的解决方案

先看问题: 当我在富文本输入并移出鼠标焦点的时候, 控制台抛出错误Cannot read properties of undefined (reading replace), 而导致jquery.validate无法对其他表单组件进行校验 1.定位问题: jquery.validate的初始化是监听了表单$("#addOrEditForm").validate(),…

Nacos的服务注册之服务端

上节讲到了nacos的客户端,通过把实例信息封装成instance,调用服务端的接口:/instance,进行注册. 接下来,我们一起看看服务端是怎么处理客户端发来的请求的. 服务端 在nacos-naming这个模块中,在这个模块里边有一个InstanceController 其中在com.alibaba.nacos.naming.contro…

Netty_03_ByteBuf和网络中拆包粘包问题及其解决

文章目录一、前言二、ByteBuf&#xff08;Netty API中定义的数据类型&#xff09;2.1 ByteBuf2.1.1 ByteBuf创建的方法有两种2.1.2 ByteBuf的存储结构2.1.3 ByteBuf中常用的方法APIReader相关方法Write相关方法Write可能导致扩容2.2 ByteBuf代码(演示读写指针移动和扩容)2.2.1 …

RabbitMQ:基础概述

RabbitMQ 是一个消息中间件&#xff0c;它接收消息并且转发&#xff0c;是“消费-生产者模型”的一个典型的代表&#xff0c;一端往消息队列中不断的写入消息&#xff0c;而另一端则可以读取或者订阅队列中的消息。 RabbitMQ 于 2007 年发布&#xff0c;由 erlang 语言进行开源…

37_软件I2C通信实验

目录 I2C通信协议 多主机I2C总线系统结构 I2C协议 应答信号ACK 数据有效性 数据传输 I2C设备地址 I2C通讯整个过程 硬件连接 EEPROM(24C02) 24C02字节写时序 24C02字节读时序 实验源码 I2C通信协议 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公…

ATtiny13与Proteus仿真-ADC仿真

ADC仿真 1、ADC介绍 ATtiny13的ADC有如下特点: 10位分辨率0.5 LSB 积分非线性 2 LSB 绝对精度13 - 260 μs 转换时间在最高分辨率下高达 15 kSPS四个多路复用单端输入通道ADC 结果读数的可选左调整0 - VCC ADC 输入电压范围可选择的 1.1V ADC 参考电压自由运行或单一转换模式…

[附源码]计算机毕业设计家庭医生签约服务管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

dmb ish osh

转自&#xff1a;原理和实战解析Linux中如何正确地使用内存屏障 圈里流传着一句话“珍爱生命&#xff0c;远离屏障”&#xff0c;这足以说明内存屏障是一个相当晦涩和难以准确把握的东西。使用过弱的屏障&#xff0c;会导致软件不稳定。使用过强的屏障&#xff0c;会引起性能问…

c语言篇(动态内存管理)

前言&#xff1a; 对于数据的存储我们可以静态存储&#xff0c;也可以动态存储&#xff0c;两种方式都有自己特有的好处&#xff0c;这篇文章教我们如和进行动态的数据存储&#xff01;&#xff01;&#xff01;&#xff01; &#x1f49e; &#x1f49e; 欢迎来到小马学习代码…

自动驾驶之单目3D目标检测TensorRT调研

目前在github上只能找到2个项目 TensorRT-CenterNet-3D tkDNN 两者都是使用CenterNet&#xff0c;但第1个基于TensorRT5,无法与当前最新的TensorRT6和TensorRT7兼容。经测试&#xff0c;第1个无法在XavierJetpack 4.3/4.4上部署&#xff0c;因此选择部署第二个tkDNN。 1. 基本…

Python学习基础笔记三十八——time模块

1、time模块&#xff1a;和时间有关系的&#xff0c;我们就用到了时间模块&#xff1a; import timeprint(time.time()) #获得当前时间戳 2、表示时间的三种方式&#xff1a; 在Python中&#xff0c;通常用三种方式来表示时间&#xff1a;时间戳、元组(struct_time)、格式…