r+疑问,到底能不能覆盖,覆盖哪部分内容?

r+疑问,到底能不能覆盖,覆盖哪部分内容?


1,我建了一个文档,上面输入四行9,8,7,6,一个数字一行。然后按照下面代码运行时,第一行和第二行被替换成1,2,其余不变,变成(1,2,7,6),然后不管再执行多少次,都还是这样。

def write_file():
    file_name='write_word.txt'
    with open(file_name,'r+',encoding='utf-8') as f:
        f.write('1\n')
        f.write('2\n')

2,同样的文档,内容还是9,8,7,6,按如下代码运行,第一次运行内容被追加写入在第5,6行,变成(9,8,7,6,1,2),然后每次运行,都在后面追加1,2两行。即9,8,7,6,1,2,1,2,1,2......打印出来的结果为上一次运行结束后文档的内容。

def write_file():
    file_name='write_word.txt'
    with open(file_name,'r+',encoding='utf-8') as f:
        print(f.read())
        f.write('1\n')
        f.write('2\n')

3,还是同样的文档,(9,8,7,6),按如下代码运行,第一次运行前两行被替换,变成(1,2,7,6),打印的内容为(7,6),重复运行,文档内容不再改变,打印内容也和第一次相同。

def write_file():
    file_name='write_word.txt'
    with open(file_name,'r+',encoding='utf-8') as f:
        f.write('1\n')
        f.write('2\n')
        print(f.read())

这三段代码唯一的不同在于print(f.read())这句,有或者没有,在write之前或者之后,结果都不同,请详细解释,谢谢!

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学,你好。一个中文占3个字节,若使用seek()则参数应是3的倍数,例seek(6)

http://img1.sycdn.imooc.com//climg/5e76cdd7097de59105490223.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~


  • 木苗 提问者 #1
    果然可以了,谢谢老师!
    2020-03-23 12:16:30
好帮手乔木 2020-03-20 10:50:43

同学你好:

这个读取文件的指针有关系(标注的就是)。

http://img1.sycdn.imooc.com//climg/5e742e240908a0ad03630152.jpg

一开始,文件的指针在开头。写入时,从前向后依次覆盖写入,由于同学写入时只替换了两行数据,所以就是1276的现象。

例如写入四行:

http://img1.sycdn.imooc.com//climg/5e742da109f929ab02190152.jpg

http://img1.sycdn.imooc.com//climg/5e742dec09b7ff8b06630234.jpg

http://img1.sycdn.imooc.com//climg/5e742e0009efe10f01870167.jpg

2、第二种,同学先读了一遍,这时,文件的指针在文本最后的位置,所以就会根据指针的位置依次进行覆盖。由于后面没有内容,所以会出现追加的现象。

3、指针在文件的开头,所以1和2会将9和8代替。这时文件的指针在2的后面,然后在读取数据,这时,文件指针的后面只有7和6,所以输出7和6,但文件的内容已经改为1276。

文件的所有操作都是根据文件指针的位置来操作的。

如果我解决了同学的问题,请采纳!学习愉快^_^。

  • 提问者 木苗 #1
    那就是说,起始r+是可以覆盖的,覆盖的时候鼠标指针之后的内容。那w+也是覆盖,以w+打开时会清空文档,先read再write的话,应该没有输出内容。 file_name = 'write_word.txt' with open(file_name, 'w+', encoding='utf-8') as f: print(f.read()) f.write('1\n') f.write('2\n') 但是如果先write再read的话还是没有输出内容,debug运行发现是执行到write语句时并没有在文档中添加内容,而是with语句执行完之后文档中才添加内容,所以执行到read时文档中没有内容,所以没有输出。那w+读写模式下,怎么读才能读到里面的内容? file_name = 'write_word.txt' with open(file_name, 'w+', encoding='utf-8') as f: f.write('1\n') f.write('2\n') print(f.read())
    2020-03-20 14:01:34
  • 好帮手乔木 回复 提问者 木苗 #2
    同学你好: w+正如同学所说,打开文件后会清空文件的内容,所以写入后在进行读,由于指针的位置是读取不到数据的。所以同学可以使用seek方法定义一下指针的位置。file_name = 'write_word.txt' with open(file_name, 'w+', encoding='utf-8') as f: f.write("1\n") f.seek(0)#将指针定义到开头的位置 print(f.read()) 如果我解决了同学的问题,请采纳!学习愉快^_^。
    2020-03-20 17:46:32
  • 提问者 木苗 回复 好帮手乔木 #3
    这样子确实可以。但是seek,老师不是说是跳过几个字符吗?而且文档内容是中欧文会报错。参数给0意思就是让指针回到最开始的位置,seek(1)也可以输出。但是我将write的内容改为中文,seek(0)可以运行,seek(1)就报错了,应该就是老师说的不能应用于中文的情况。那为啥seek(0)对中文能正常运行。我查看文档说明,并没有解释这个。请老师解释,谢谢!
    2020-03-20 21:07:55
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师