show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- 上次我们研究追加文件
- 追加文件就是把文件打开
- 然后在后面写上要写的内容
- 还有读写功能+
- 这可以让我们既可以读又可以写
- 我还想让程序写点复杂的程序
- 从文件读取信息
- 可以么?🤔
- 往文本里面写了两个东西
- 人名: "oeasy"
- 工作时间 "12"
- 这两个都是文本型的
- 用"\n"分隔开
- 可以进行读写操作
- 如果我想把工作时间修改为 byte 型的数字变量呢?
- 数字形式的变量还可以保存成txt文件么?
- txt格式一般存储的是文本text
- 这和织物有什么关系
- 以前的人看到密密麻麻的文字很像织物(texture)
- 人类社会先有织物后有密密麻麻排布好的文字
- 所以起了text这么名字
- 我们如果直接用二进制方式写字节型的数字
- 就肯定不是纯文本了
- 为了避免误会
- 把扩展名txt取消
- 我们打开一个新文件(oeasy)
- 不是刚才的oeasy.txt
- 先写字符串信息
- 用的是默认的"w"
- 相当于"wt"
- 文本模式
- 注意一定要有个
\n
作为分隔符 - 追加写文件
- 然后就是追加写二进制字节数字
- 用的模式是ab
- a append 追加
- b binary 二进制
- 用的模式是ab
- 注意使用追加二进制写模式
- f = open("oeasy","ab")
- 确实在文本型的名字后面追加了一个字节
- b_num = struct.pack("b",5)
- 字节型整数
- 数值为5
- 这个过程其实是一个序列化
- 或者叫做串行(xíng)化 (Serialize)
- 就像一系列的序列号一样
- 是有顺序存储的字节序列
- 我们可以把我们的数据内容
- 按照字节流的方式
- 存储于各个地方
- 这就是序列化 Serialize
- 然后可以再读取字节流
- 转化为我们的数据内容
- 这就是反序列化
- 或者说反串行化
- deserialize
vi oeasy
- :%!xxd
- 转化为2进制
-
:%!xxd -r
- 转化回去
-
然后我们去文件读取
- 先读出名字
- 用的是默认的 rt 模式
- 读文本
- 然后是读出工作时长
- 用的是指定的 rb 模式
- 读二进制
- 如果除了名字和工作时长之外
- 还需要读写每小时工资呢?
- 每小时工资是一个 double 型的变量
- 这次我们再打开一个新文件(oeasyd)
- 之前读写的文件是(oeasy)
- 还是先往新文件(oeasyd)里面写人名(oeasy)
- 使用的模式是默认的"w"
- 也就是"wt"
- 使用的模式是默认的"w"
- 再写工作时长
- 最后写单位时间工资
- 尝试把他读出来
- 尝试 readline
- 但是失败了
- 因为这次写的模式是
- 先wt写名字
- 再ab方式写数字
- 写完名字(oeasy)之后没有添加line的结束标记
\n
- 而且用的是"rt"模式
- 所以读到了后面一些字节
- 而这些字节无法转化为utf-8的文本
- 这个0x9a怎么来的呢?
- 第3个字节就是0x9a
- 0x91之前还没有换行符分不开
- 这次别忘了\n分隔符
- 重新写
- 别忘了
\n
- 然后把两个数字型的变量写进去
- 成功了
- 名字、工作时长、每小时工资这三个数据分别写了进去
- 构成了一个序列 serial
- 这种写文件的过程就是序列化
- 复杂的字处理、电子表格、图像、3d 工程
- 也是按照他们自身定义的序列方式写进文件
- 然后读出来的
- 我们来试试读出来
- 见上图
- 先用默认的 rb 模式读出名字
- 因为rt模式 有时会影响到readline读不出来
- 并关闭文件
- 然后去找到后面的数字位置
- 名字之后有两个数字
- 1 个字节 的 整型数字
- 8 个字节 的 双精度浮点型数字
- 总共 9 个字节
- 这次使用rb方式打开文件
- 见上图
- 先找到读取位置
- seek(-9,2)
- 找到从结尾往前 9 个字节的位置
- 9个字节 来自于 之前提到的 1 + 8
- 先读字节型整数
- 最后去读取 8 字节的双精度浮点数
- 读取最后的八个字节
- 见上图
- 总共没几个字节
- 还要读 3 次
- 太费劲了
- 并且落实到py文件
- 这个单词来自于serial序列
- serial tv系列电视剧
- serial number 序列号
- serial podcast 系列广播
-
serial dilution 梯度稀释
- 按梯度稀释
- 一步步来
-
usb
- Universal Serial Bus
- 通用串行总线
- 信号是按照序列进行传递的
- 序列化
- 将一个对象转化成字节流的形式
- 方便存储和传输
- 反序列化是将字节流
- 转化为对象
- 序列化和反序列化
- 就是在将字节流和对象相互转化
- 完成传输和存储
- 字节序列是按照文件格式排列的
- 这次我们研究数据序列化
- 字符串
- 字节型整数
- 双精度浮点数
- 依次写入
- 然后可以进行数据类型转化
- 并且进行运算
- 可以对于序列化
- 定点写入
- 定点读取
- 这并不难
- 我们可以按照需求对文件进行读写操作么?🤔
- 下次再说 👋