Skip to content

Latest commit

 

History

History
203 lines (141 loc) · 4.96 KB

197-190654-追加写入.sy.md

File metadata and controls

203 lines (141 loc) · 4.96 KB
show version enable_checker
step
1.0
true

追加写入

回忆

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

搜索

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

图片描述

  • 感觉就是 a
  • appending 模式

图片描述

构思

图片描述

  • 看起来确实是 append 上去了
  • 原来的东西不会 truncate
  • 但是一会儿 w或a 一会儿 r
  • 切来切去好麻烦
  • 可以又 w 又 r 么?

搜索

  • help(open)

图片描述

  • 感觉就是+

实验

  • 继续书写
  • 有种势如破竹的感觉

图片描述

  • a+ 其实就是append + read
  • 那我可以把 a 当做 w 来用么?

尝试

图片描述

  • 想要先清空
  • 然后再写
  • 好像失败了
  • 为什么呢
    • 查询函数定义

图片描述

  • 问题是查什么呢?

查文档

图片描述

  • 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

图片描述

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

尝试

  • 把原来的先读出来

图片描述

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

用二进制写文本

图片描述

  • 可以先把文本转化为字节
  • 然后用二进制的方式写字节
  • 然后再用文本的方式读出来
  • 一点毛病没有

用文本写二进制

图片描述

图片描述

  • 可以把二进制字节序列文本化
  • 但是有点问题
  • 有些二进制字节无法对应具体文本
    • 比如b"\x00"
    • 这就没有办法了...

总结

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