Crossin的编程教室

标题: 文件读写中r+ 模式为什么会出现如下结果呢? [打印本页]

作者: 风风魔王    时间: 2020-3-26 20:28
标题: 文件读写中r+ 模式为什么会出现如下结果呢?
本帖最后由 风风魔王 于 2020-3-27 09:30 编辑

#test.txt内容
123
456
789
代码如下:

f = open('test.txt', 'r+')
print(f.tell(), end = ' ')
f.write('000\n')
print(f.tell(), end = ' ')
f.readline()
print(f.tell(), end = ' ')
f.write('999')
print(f.tell(), end = ' ')
f.close()


输出结果是

0 5 10 16
而test.txt也被修改为了
000
456
789999
但是代码如果改成(仅仅是把write和readline之间的f.tell()去掉了,结果就大相径庭

f = open('test.txt', 'r+')
print(f.tell(), end = ' ')
f.write('000\n')
f.readline()
print(f.tell(), end = ' ')
f.write('999')
print(f.tell(), end = ' ')
f.close()

输出结果是0 10 21

而text.txt居然被修改成了
123
456
789000
999
请问先生这是什么情况?为什么连第一个write()写的内容都被添加到文件末尾了?
作者: 风风魔王    时间: 2020-3-27 09:33
本帖最后由 风风魔王 于 2020-3-27 09:35 编辑

我已经凌乱了,随便试试就有令人意想不到的记结果
如果一开始使用seek的话,那么紧接着的写入也会写到最后面,readline()操作之后使用seek 又可以实现写在自己想写的位置了,python的文件指针也太令人摸不着头脑了吧
f = open('test.txt', 'r+)
print(f.tell(), end = ' ')
f.seek(0)
print(f.tell(), end = ' ')
f.write('000\n')
f.readline()
print(f.tell(), end = ' ')
f.seek(1)
print(f.tell(), end = ' ')
f.write('999')
print(f.tell(), end = ' ')

f.close()


输出结果是 0 0 10 1 4

修改后的文件是
1999456
789000

作者: crossin先生    时间: 2020-3-27 19:34
是比较绕,给你个参考:
https://www.cnblogs.com/huahuayu/p/8093867.html

文件r+ open:
  1. write()不能实现插入写,它总是覆盖写或附加写;
  2. 如果文件一打开即write(),则从开头覆盖写;
  3. 如果文件一打开,用f.seek()指定文件指针位置,然后执行f.write()则从指针位置写(覆盖写);
  4. 如文件打开后先执行了readline(), 然后再执行write(),实现的是附加写

另外从实际角度来说就是,尽量不要用r+,并没有一定用它的必要,反倒会引入一堆不确定
作者: 风风魔王    时间: 2020-3-28 15:40
crossin先生 发表于 2020-3-27 19:34
是比较绕,给你个参考:
https://www.cnblogs.com/huahuayu/p/8093867.html

先生太强了,谢谢先生,刚学到文件读写这里困扰两天了!




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5