设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 7538|回复: 3
打印 上一主题 下一主题

文件读写中r+ 模式为什么会出现如下结果呢?

[复制链接]

6

主题

0

好友

218

积分

中级会员

Rank: 3Rank: 3

跳转到指定楼层
楼主
发表于 2020-3-26 20:28:25 |只看该作者 |倒序浏览
本帖最后由 风风魔王 于 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()写的内容都被添加到文件末尾了?
回复

使用道具 举报

6

主题

0

好友

218

积分

中级会员

Rank: 3Rank: 3

沙发
发表于 2020-3-27 09:33:27 |只看该作者
本帖最后由 风风魔王 于 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
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2020-3-27 19:34:25 |只看该作者
是比较绕,给你个参考:
https://www.cnblogs.com/huahuayu/p/8093867.html

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

另外从实际角度来说就是,尽量不要用r+,并没有一定用它的必要,反倒会引入一堆不确定
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

6

主题

0

好友

218

积分

中级会员

Rank: 3Rank: 3

地板
发表于 2020-3-28 15:40:53 |只看该作者
crossin先生 发表于 2020-3-27 19:34
是比较绕,给你个参考:
https://www.cnblogs.com/huahuayu/p/8093867.html

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-4-19 15:24 , Processed in 0.017259 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部