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的作用是改变文本流中指针的位置
- 刚才的流程是
- 先写"o5z"
- 再改位置回最初
- 最后再读
- 我们应该先改位置,再去写
- 这样我们就可以重头改写文档了
- 注意是彻底改写
- 原来文档后面的"o2z"之类的都消失了
- 查询文档真的有用
- 我们再来查查truncate函数
- truncate 本意是锯断木头
- 这里也可以锯断文件
- truncate在没有参数的时候和tell一样
- 返回目前长度
- 有参数的话可以截断字符串
- 截断字符串是按照参数来截断的
- f.truncate(3) 留3个字节
- f.truncate(2) 留2个字节
- f.truncate(1) 留1个字节
- f.truncate(0) 彻底清空
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 即可。



























