鱼C论坛

 找回密码
 立即注册
查看: 905|回复: 11

[已解决]r+模式写文件为什么会出现以下结果呢?

[复制链接]
发表于 2020-3-26 20:20:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 风风魔王 于 2020-3-26 20:21 编辑

#test.txt内容为:
123
456
789
1011
1213

代码如下:
  1. f = open('test.txt', 'r+')
  2. content = f.readlines()
  3. f.seek(0)
  4. f.write('0000')
  5. for each_line in content:
  6.     if each_line == '789':
  7.         f.write('0000')
  8.     else:
  9.         f.readline()

  10. f.close()
复制代码
为什么代码执行结果是
123
456
789
1011
1213
0000
而不是
0000
456
0000
1011
1213呢?
第一个write把0000写在了文件末尾,第二个write()压根就不写,这是为什么呢?
最佳答案
2020-3-27 08:40:26
风风魔王 发表于 2020-3-26 22:41
大佬 r+ 不是 追加模式呀 a+ 才是吧

不管是r+还是a+都是追加模式,没有哪种模式可以随意插入
如果有中间插入的需求,需要先全部读出来,插入后再全部写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-26 20:29:52 | 显示全部楼层
打开文件读取后,文件指针已经指到末尾,所以第一个write直接写在最后

后面判断中的 each_line在最后都是带着'\n'字符的,所以要写成 if each_line ==  '789\n'
而且也会写在最后
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-3-26 20:31:41 | 显示全部楼层
BngThea 发表于 2020-3-26 20:29
打开文件读取后,文件指针已经指到末尾,所以第一个write直接写在最后

后面判断中的 each_line在最后都 ...

可是我用f.seek(0)把指针改到文件开始了呀?意思是f.seek(0)对写文件不管用,只能改变读的位置吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 20:53:54 | 显示全部楼层
风风魔王 发表于 2020-3-26 20:31
可是我用f.seek(0)把指针改到文件开始了呀?意思是f.seek(0)对写文件不管用,只能改变读的位置吗?

一般来说以追加的形式写入都只能写到文件末尾(要不然叫“追加”),而不能通过seek调整随便写到哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 22:41:47 | 显示全部楼层
BngThea 发表于 2020-3-26 20:53
一般来说以追加的形式写入都只能写到文件末尾(要不然叫“追加”),而不能通过seek调整随便写到哪里

大佬 r+ 不是 追加模式呀 a+ 才是吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 06:24:37 From FishC Mobile | 显示全部楼层
你这种操作可以称呼为  插入写入
这应该是不可能实现的操作,无论你是以何种方式打开文件,无论你的指针定位在哪里
那么如何实现插入写入呢,需要把插入点后面的数据提取出来,然后再插入点写入数据,然后再把刚才提取的数据再追加到末尾
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 08:40:26 | 显示全部楼层    本楼为最佳答案   
风风魔王 发表于 2020-3-26 22:41
大佬 r+ 不是 追加模式呀 a+ 才是吧

不管是r+还是a+都是追加模式,没有哪种模式可以随意插入
如果有中间插入的需求,需要先全部读出来,插入后再全部写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-3-27 08:49:37 | 显示全部楼层
BngThea 发表于 2020-3-27 08:40
不管是r+还是a+都是追加模式,没有哪种模式可以随意插入
如果有中间插入的需求,需要先全部读出来,插入 ...

https://fishc.com.cn/thread-162551-1-1.html
大佬你看下这个帖子,这个里面使用r+就实现了随意插入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 08:56:48 | 显示全部楼层
风风魔王 发表于 2020-3-27 08:49
https://fishc.com.cn/thread-162551-1-1.html
大佬你看下这个帖子,这个里面使用r+就实现了随意插入

可能是我理解的不到位
但我觉得不重要,重要的是不提倡覆写的模式,毕竟它会覆盖文本原来的内容,而不是真正意义的插入操作
还是那句话,如果有中间位置插入需求,还是先都读取出来,插入后再写入更保险
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 09:12:10 | 显示全部楼层
BngThea 发表于 2020-3-27 08:56
可能是我理解的不到位
但我觉得不重要,重要的是不提倡覆写的模式,毕竟它会覆盖文本原来的内容,而不是 ...

大佬谦虚了,谢谢大佬!
这里有个别的疑惑,那word之类的软件实现中间位置插入的话,也是这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 09:57:48 | 显示全部楼层
风风魔王 发表于 2020-3-27 09:12
大佬谦虚了,谢谢大佬!
这里有个别的疑惑,那word之类的软件实现中间位置插入的话,也是这样吗?

不太清楚word底层实现,但我感觉至少是有链表以上的数据结构来处理,单纯的指针有点不够用吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-27 10:06:35 | 显示全部楼层
BngThea 发表于 2020-3-27 09:57
不太清楚word底层实现,但我感觉至少是有链表以上的数据结构来处理,单纯的指针有点不够用吧

感谢大佬!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 10:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表