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的作用是改变流的位置
- 刚才的流程是
- 先写"o5z"
- 再改位置回最初
- 最后再读
- 我们应该先改位置,再去写
- 这样我们就可以重头改写文档了
- 注意是彻底改写
- 原来文档后面的"o2z"之类的都消失了
- 查询文档真的有用
- 我们再来查查truncate函数
- truncate 本意是锯断木头
- 这里也可以锯断文件
- truncate在没有参数的时候和tell一样
- 返回目前长度
- 有参数的话可以截断字符串
- 截断字符串是按照参数来截断的
- f.truncate(3) 留3个字节
- f.truncate(2) 留2个字节
- f.truncate(1) 留1个字节
- f.truncate(0) 彻底清空
- 这样我们就用 a 干了 w 的事情
- 反过来
- 那我们能用 w 干 a 的事情吗?
- 把原来的先读出来
- 然后先把内容读到s_original
- w清空后
- 先写进s_original
- 再写新的
- 这不就是追加了么?
- 写入(w)和追加(a)两种模式可以相互转化了
- 无论w+还是a+
- 这个+模式只是让写入模式下增加了读(read)的功能
- 那么二进制(b)和文本(t) 两种模式可以转化么?
- 可以先把文本转化为字节
- 然后用二进制的方式写字节
- 然后再用文本的方式读出来
- 一点毛病没有
- 可以把二进制字节序列文本化
- 但是有点问题
- 有些二进制字节无法对应具体文本
- 比如
b"\x00"
- 这就没有办法了...
- 比如
- 这次我们研究追加文件
- 追加文件就是把文件打开
- 然后在后面写上要写的内容
- 还有读写功能+
- 这可以让我们既可以读又可以写
- w 和 a 不是孤立的
- 而且是可以相互转化的
- b 和 t 也不是孤立的
- 也是可以相互转化的
- 我还想让程序写点复杂的程序
- 从文件读取信息
- 完成个计算
- 可以么?🤔
- 下次再说 👋