Skip to content

Latest commit

 

History

History
384 lines (259 loc) · 6.83 KB

File metadata and controls

384 lines (259 loc) · 6.83 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 3 column 1
---
- oeasy Python 0445
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
本教程同步发布在: 

     个人网站: `https://oeasy.org` 
     蓝桥云课: `https://www.lanqiao.cn/courses/3584` 
     GitHub: `https://github.com/overmind1980/oeasy-python-tutorial` 
     Gitee: `https://gitee.com/overmind1980/oeasypython` 
---

追加写入

回忆

  • 上次我们搞的是文件读写的锁定
  • 靠的是 fcntl 这个包
  • 可以有
    • 分享锁 LOCK_SH
    • 独享锁 LOCK_EX
    • 阻塞标志 LOCK_NB
    • 取消锁 LOCK_UN
  • 不过得到锁了之后
  • 也是在原始基础上把原来的内容抹掉了
  • 我想要原来的都在
  • 新来的追加进去
  • 可以么?
  • 去哪里搜呢 🤔
  • 问你呢!!!

图片描述

  • 使用a模式

搜索

  • 去 open 那里找找思路
  • help(open)

图片描述

  • 感觉就是 a

图片描述

  • appending 模式

构建

touch oeasy.txt
ls oeasy.txt
  • 生成文件

图片描述

  • 文件已经存在

观察文件

f = open("oeasy.txt", "r")
f.read()
f.close()
  • 新建的文件为空

图片描述

开始写入

f = open("oeasy.txt", "w")
f.write("oeasy")
f.close()
  • 写入oeasy

图片描述

  • 怎么追加呢?

追加写入

  • 把 写入write
    • 修改为 追加append
f = open("oeasy.txt", "a")
f.write("o2z")
f.close()
  • 写入了3-bytes

图片描述

再次读取

f = open("oeasy.txt", "r")
f.read()
f.close()
  • 看起来确实是 append 上去了
    • 原来的东西不会 truncate

图片描述

  • 但是一会儿 w或a 一会儿 r
    • 切来切去好麻烦
  • 可以 既写write 又read 吗?

搜索

help(open)

图片描述

  • 感觉就是+

实验

  • 继续书写
f = open("oeasy.txt", "a+")
f.write("o3z")
f.write("o4z")
f.seek(0)
f = open("oeasy.txt", "r")
f.read()
f.close()
  • 有种势如破竹的感觉
    • a+ 其实就是append + read

图片描述

  • 那我可以把 a 当做 w 来用么?

尝试

  • 想要先清空
    • 然后再写

图片描述

  • 好像失败了
    • 为什么呢?

图片描述

  • 查询函数定义?
    • 问题是查什么呢?

查文档

help(open)
  • open函数有帮助文档

图片描述

  • 告诉我们返回4种对象类型
TextIOWrapper BufferedReader BufferedWriter BufferedRandom
r/wt/rt.. rb wb wb+
文本封装 二进制读缓存 二进制写缓存 二进制读写缓存
  • 我查查文本的TextIOWrapper

图片描述

seek函数

图片描述

  • seek的作用是改变文本流中指针的位置

图片描述

  • 刚才的流程是
    • 先写"o5z"
    • 再改位置回最初
    • 最后再读

清空位置

  • 我们应该先改位置,再去写

图片描述

  • 这样我们就可以重头改写文档了
    • 注意是彻底改写
    • 原来文档后面的"o2z"之类的都消失了

truncate

  • 查询文档真的有用
    • 我们再来查查truncate函数

图片描述

  • truncate 本意是锯断木头
  • 这里也可以锯断文件

图片描述

truncate

  • truncate在没有参数的时候和tell一样
    • 返回目前长度
  • 有参数的话可以截断字符串

图片描述

  • 截断字符串是按照参数来截断的
    • f.truncate(3) 留3个字节
    • f.truncate(2) 留2个字节
    • f.truncate(1) 留1个字节
    • f.truncate(0) 彻底清空

用a来w

f = open("oeasy.txt", "w")
f.write("o2zo3zo4zo5z")
f.close()
  • 重写文件

图片描述

追加读取

f = open("oeasy.txt", "a+")
f.read()
  • 追加模式读取文件
    • 由于指针在最后
    • 读不出来

图片描述

  • 想读出怎么办呢?

从头读取

  • 把文本流指针 放在开头
f.seek(0)
f.read()
  • 再读取

图片描述

  • 想要重新写文件
    • 需要把原文件清空

清空文件

f.truncate(0)
f.read()
  • 已经把文件清空

图片描述

再写文件

f.write("oeasy")
  • 写完再读
f.read()
  • 啥也读不出来

图片描述

  • 为什么呢?

控制指针

  • 因为 指针位置 在最后
f.seek(0)
f.read()
f.close()
  • 把文本流的指针 切回到 最初的位置
    • 从开头读取

图片描述

  • 这样我们就用 a 干了 w 的事情
    • 那我们 反过来 吗?
    • 能用 w 干a 的事情吗?

尝试

  • 先把内容读到s_original

图片描述

  • w清空后
    • 先写进s_original
    • 再写新的
    • 这不就是追加了么?
  • 写入(w)和追加(a)两种模式可以相互转化了
    • 无论w+还是a+
    • 这个+模式只是让写入模式下增加了读(read)的功能
  • 那么二进制(b)和文本(t) 两种模式可以转化么?

用二进制写文本

  • 可以先把文本转化为字节
    • 再用二进制的方式写字节

图片描述

  • 最后 用文本的方式读出来
    • 一点毛病没有

用文本写二进制

  • 可以把二进制字节序列文本化

图片描述

  • 但是有点问题
    • 有些二进制字节 并不 对应具体文本字符
    • 比如b"\x00"

图片描述

  • 这就没有办法了...

总结

  • 这次我们研究追加文件
    • 追加文件就是把文件打开
    • 然后在后面写上要写的内容
  • 还有读写功能+
    • 这可以让我们既可以读又可以写
    • w 和 a 不是孤立的
      • 而且是可以相互转化的
    • b 和 t 也不是孤立的
      • 也是可以相互转化的
  • 我还想让程序写点复杂的程序
    • 从文件读取信息
    • 完成个计算
  • 可以么?🤔
  • 下次再说 👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。