鱼C论坛

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

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

[复制链接]
最佳答案
1 
发表于 前天 20:20 | 显示全部楼层 |阅读模式

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

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

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()压根就不写,这是为什么呢?
最佳答案
昨天 08:40
风风魔王 发表于 2020-3-26 22:41
大佬 r+ 不是 追加模式呀 a+ 才是吧

不管是r+还是a+都是追加模式,没有哪种模式可以随意插入
如果有中间插入的需求,需要先全部读出来,插入后再全部写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1491 
发表于 前天 20:29 | 显示全部楼层
打开文件读取后,文件指针已经指到末尾,所以第一个write直接写在最后

后面判断中的 each_line在最后都是带着'\n'字符的,所以要写成 if each_line ==  '789\n'
而且也会写在最后
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1 
 楼主| 发表于 前天 20:31 | 显示全部楼层
BngThea 发表于 2020-3-26 20:29
打开文件读取后,文件指针已经指到末尾,所以第一个write直接写在最后

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

可是我用f.seek(0)把指针改到文件开始了呀?意思是f.seek(0)对写文件不管用,只能改变读的位置吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1491 
发表于 前天 20:53 | 显示全部楼层
风风魔王 发表于 2020-3-26 20:31
可是我用f.seek(0)把指针改到文件开始了呀?意思是f.seek(0)对写文件不管用,只能改变读的位置吗?

一般来说以追加的形式写入都只能写到文件末尾(要不然叫“追加”),而不能通过seek调整随便写到哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1 
 楼主| 发表于 前天 22:41 | 显示全部楼层
BngThea 发表于 2020-3-26 20:53
一般来说以追加的形式写入都只能写到文件末尾(要不然叫“追加”),而不能通过seek调整随便写到哪里

大佬 r+ 不是 追加模式呀 a+ 才是吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
342 
发表于 昨天 06:24 From FishC Mobile | 显示全部楼层
你这种操作可以称呼为  插入写入
这应该是不可能实现的操作,无论你是以何种方式打开文件,无论你的指针定位在哪里
那么如何实现插入写入呢,需要把插入点后面的数据提取出来,然后再插入点写入数据,然后再把刚才提取的数据再追加到末尾
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1491 
发表于 昨天 08:40 | 显示全部楼层    本楼为最佳答案   
风风魔王 发表于 2020-3-26 22:41
大佬 r+ 不是 追加模式呀 a+ 才是吧

不管是r+还是a+都是追加模式,没有哪种模式可以随意插入
如果有中间插入的需求,需要先全部读出来,插入后再全部写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1 
 楼主| 发表于 昨天 08:49 | 显示全部楼层
BngThea 发表于 2020-3-27 08:40
不管是r+还是a+都是追加模式,没有哪种模式可以随意插入
如果有中间插入的需求,需要先全部读出来,插入 ...

https://fishc.com.cn/thread-162551-1-1.html
大佬你看下这个帖子,这个里面使用r+就实现了随意插入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1491 
发表于 昨天 08:56 | 显示全部楼层
风风魔王 发表于 2020-3-27 08:49
https://fishc.com.cn/thread-162551-1-1.html
大佬你看下这个帖子,这个里面使用r+就实现了随意插入

可能是我理解的不到位
但我觉得不重要,重要的是不提倡覆写的模式,毕竟它会覆盖文本原来的内容,而不是真正意义的插入操作
还是那句话,如果有中间位置插入需求,还是先都读取出来,插入后再写入更保险
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1 
 楼主| 发表于 昨天 09:12 | 显示全部楼层
BngThea 发表于 2020-3-27 08:56
可能是我理解的不到位
但我觉得不重要,重要的是不提倡覆写的模式,毕竟它会覆盖文本原来的内容,而不是 ...

大佬谦虚了,谢谢大佬!
这里有个别的疑惑,那word之类的软件实现中间位置插入的话,也是这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1491 
发表于 昨天 09:57 | 显示全部楼层
风风魔王 发表于 2020-3-27 09:12
大佬谦虚了,谢谢大佬!
这里有个别的疑惑,那word之类的软件实现中间位置插入的话,也是这样吗?

不太清楚word底层实现,但我感觉至少是有链表以上的数据结构来处理,单纯的指针有点不够用吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
1 
 楼主| 发表于 昨天 10:06 | 显示全部楼层
BngThea 发表于 2020-3-27 09:57
不太清楚word底层实现,但我感觉至少是有链表以上的数据结构来处理,单纯的指针有点不够用吧

感谢大佬!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

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

GMT+8, 2020-3-28 19:07

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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