关于python两次调用open产生的问题

Scorpio lam 2017-08-08 10:33:29
f = open('data.txt', 'w+')
for i in range(300):
f.write('hello world:'+str(i)+'\n')

g = open('data.txt')
print(g.read())

print结果为空:' '
手动打开data.txt:内容已经完整写入 hello world:0 ~hello world:299
此处我理解为:f.write后光标到达文件尾部,此处再次open所得的文件偏移量与第一次open一致,因此print为空

但是,当我把range(300)改成3000,print结果就不一样了,如下:
f = open('data.txt', 'w+')
for i in range(3000):
f.write('hello world:'+str(i)+'\n')

g = open('data.txt')
print(g.read())

print结果:hello world:0~hello world:2795 也就是还有一部分没有print出来
手动打开data.txt:内容已经完整写入:hello world:0 ~hello world:2999

这个地方一直想不明白。针对第二个程序,虽然在print之前调用close()后能正常输出,这里试着不调用close()进行分析:按第一个程序的理解:写入后光标应该在文件尾部,为什么print还能输出内容?而且输出的内容不少。
另外,手动打开data.txt可看到完整内容,意味着这两个程序都已完整写入data.txt了吧?
麻烦大神们指点迷津,感谢!
...全文
1459 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
KaiAowisySun 2018-09-29
  • 打赏
  • 举报
回复
引用 10 楼 xpresslink 的回复:
[quote=引用 8 楼 samlbh 的回复:]
f=open('data.txt','w')
for i in range(5):
f.write(str(i)+'\n')

g=open('data.txt')
print(g.read())
以上写入5个int,应该还没超过缓冲区大小吧?结果已经是print为空,但data.txt打开看到已经写入了。请大神再指点一下,谢谢

服了,你虽然没有显示的file.close() 但是python的进程完成退出时候会把资源释放,包括完成文件的写入。

不信你把代码改成这样:


import time

f=open('data.txt','w')
for i in range(5):
f.write(str(i)+'\n')

g=open('data.txt')
print(g.read())
time.sleep(250) # 停住 250秒
print('Finished!')


你在没有看到Finished之前去打开 data.txt看看。[/quote]

还有如果未关闭前进行file.read()操作也会强制写入吧?
yskbrainy 2017-08-12
  • 打赏
  • 举报
回复
文件打开之后一定要关闭才能print
混沌鳄鱼 2017-08-09
  • 打赏
  • 举报
回复
引用 8 楼 samlbh 的回复:
f=open('data.txt','w') for i in range(5): f.write(str(i)+'\n') g=open('data.txt') print(g.read()) 以上写入5个int,应该还没超过缓冲区大小吧?结果已经是print为空,但data.txt打开看到已经写入了。请大神再指点一下,谢谢
服了,你虽然没有显示的file.close() 但是python的进程完成退出时候会把资源释放,包括完成文件的写入。 不信你把代码改成这样:

import time

f=open('data.txt','w')
for i in range(5):
    f.write(str(i)+'\n')

g=open('data.txt')
print(g.read())
time.sleep(250)    #  停住 250秒
print('Finished!')
你在没有看到Finished之前去打开 data.txt看看。
Scorpio lam 2017-08-09
  • 打赏
  • 举报
回复
引用 7楼混沌鳄鱼 的回复:
[quote=引用 6 楼 samlbh 的回复:] 但我想问的是不调用close,为何write依旧把内容写入到data.txt中呢(手动打开查看),这里涉及到的问题能具体说说吗
我说的还不清楚么? file.write()逐行写入的时候,先写入到一个固定大小的缓冲区(LINUX是4096字节,windows好象是1024字节),当缓冲区满了时操作系统才会将缓冲区内的数据一起写入磁盘,然后清空缓冲。当你把大量数据写入文件时就是这么周而复始的工作。 当调用file.close() 时,不管缓冲区满没有满都强制写入磁盘然后关闭文件。 当你写入数据过程中,只要超过了缓冲区大小的数据量,就会有数据写入磁盘了,虽然这时还没有close [/quote]麻烦大神再指点指点
Scorpio lam 2017-08-09
  • 打赏
  • 举报
回复
引用 7 楼 xpresslink 的回复:
[quote=引用 6 楼 samlbh 的回复:] 但我想问的是不调用close,为何write依旧把内容写入到data.txt中呢(手动打开查看),这里涉及到的问题能具体说说吗
我说的还不清楚么? file.write()逐行写入的时候,先写入到一个固定大小的缓冲区(LINUX是4096字节,windows好象是1024字节),当缓冲区满了时操作系统才会将缓冲区内的数据一起写入磁盘,然后清空缓冲。当你把大量数据写入文件时就是这么周而复始的工作。 当调用file.close() 时,不管缓冲区满没有满都强制写入磁盘然后关闭文件。 当你写入数据过程中,只要超过了缓冲区大小的数据量,就会有数据写入磁盘了,虽然这时还没有close [/quote] f=open('data.txt','w') for i in range(5): f.write(str(i)+'\n') g=open('data.txt') print(g.read()) 以上写入5个int,应该还没超过缓冲区大小吧?结果已经是print为空,但data.txt打开看到已经写入了。请大神再指点一下,谢谢
混沌鳄鱼 2017-08-09
  • 打赏
  • 举报
回复
引用 6 楼 samlbh 的回复:
但我想问的是不调用close,为何write依旧把内容写入到data.txt中呢(手动打开查看),这里涉及到的问题能具体说说吗
我说的还不清楚么? file.write()逐行写入的时候,先写入到一个固定大小的缓冲区(LINUX是4096字节,windows好象是1024字节),当缓冲区满了时操作系统才会将缓冲区内的数据一起写入磁盘,然后清空缓冲。当你把大量数据写入文件时就是这么周而复始的工作。 当调用file.close() 时,不管缓冲区满没有满都强制写入磁盘然后关闭文件。 当你写入数据过程中,只要超过了缓冲区大小的数据量,就会有数据写入磁盘了,虽然这时还没有close
Scorpio lam 2017-08-09
  • 打赏
  • 举报
回复
引用 2楼混沌鳄鱼 的回复:
Python写入过程中是把字符串写入一个叫缓冲区中,当你写入的字节大于或等于缓冲区的大小,就会自动写入到文件中,而当你写入的字节小于缓冲区的大小,就会一直存在缓冲区中。 调用close()方法,就会把缓冲区的剩下数据写入到文件中 你好好看看 python的编程手册,查询一下open()函数的功能就明白了。 全缓冲 : open函数的buffering设置大于1的整数n,n为缓冲区大小,Linux默认为page的大小4096 满了n 个字节才会写入磁盘 。 f=open(“demo.txt”,’w’,buffering=1) 1 1 行缓冲 : open 函数的buffering设置为1, 碰到换行就会将缓冲区的写入磁盘。 f=open(“demo.txt”,’w’,buffering=1) 1 1 无缓冲 : open 函数的buffering设置为0 有输入就写入磁盘。 f=open(“demo.txt”,’w,’,buffering=0) 1 1 缓冲的目的:是为了减少系统的io调用。只有当符合一定条件(比如缓冲数量)时才调用io
调用close后可以解决问题。 但我想问的是不调用close,为何write依旧把内容写入到data.txt中呢(手动打开查看),这里涉及到的问题能具体说说吗
Scorpio lam 2017-08-09
  • 打赏
  • 举报
回复
引用 1楼似梦飞花 的回复:
f = open('d://data.txt', 'w+') for i in range(300): f.write('hello world:'+str(i)+'\n') f.close() g = open('d://data.txt') print(g.read()) 写完close下
调用close后可以解决问题。 但我想问的是不调用close,为何write依旧把内容写入到data.txt中呢(手动打开查看)
Scorpio lam 2017-08-09
  • 打赏
  • 举报
回复
引用 7 楼 xpresslink 的回复:
[quote=引用 6 楼 samlbh 的回复:] 但我想问的是不调用close,为何write依旧把内容写入到data.txt中呢(手动打开查看),这里涉及到的问题能具体说说吗
我说的还不清楚么? file.write()逐行写入的时候,先写入到一个固定大小的缓冲区(LINUX是4096字节,windows好象是1024字节),当缓冲区满了时操作系统才会将缓冲区内的数据一起写入磁盘,然后清空缓冲。当你把大量数据写入文件时就是这么周而复始的工作。 当调用file.close() 时,不管缓冲区满没有满都强制写入磁盘然后关闭文件。 当你写入数据过程中,只要超过了缓冲区大小的数据量,就会有数据写入磁盘了,虽然这时还没有close [/quote] 还有一个问题请教下: import time f = open('data.txt', 'w') for i in range(3000): f.write(str(i) + '\n') g = open('data.txt') print(g.read()) time.sleep(10) print('Finished!') write写入到文件data.txt以后,光标应该在文件尾。此时再g = open('data.txt'),光标应该还在文件尾部(不同文件描述符指向同个文件,偏移量一样),为什么还能打印出内容呢?不是应该指向文件尾的空白吗?
似梦飞花 2017-08-08
  • 打赏
  • 举报
回复
f = open('d://data.txt', 'w+') for i in range(300): f.write('hello world:'+str(i)+'\n') f.close() g = open('d://data.txt') print(g.read()) 写完close下
chuifengde 2017-08-08
  • 打赏
  • 举报
回复
在循环内加个f.flush()或循环外加个f.close()
sanGuo_uu 2017-08-08
  • 打赏
  • 举报
回复
open以后要close。回答完毕
混沌鳄鱼 2017-08-08
  • 打赏
  • 举报
回复
Python写入过程中是把字符串写入一个叫缓冲区中,当你写入的字节大于或等于缓冲区的大小,就会自动写入到文件中,而当你写入的字节小于缓冲区的大小,就会一直存在缓冲区中。 调用close()方法,就会把缓冲区的剩下数据写入到文件中 你好好看看 python的编程手册,查询一下open()函数的功能就明白了。 全缓冲 : open函数的buffering设置大于1的整数n,n为缓冲区大小,Linux默认为page的大小4096 满了n 个字节才会写入磁盘 。 f=open(“demo.txt”,’w’,buffering=1) 1 1 行缓冲 : open 函数的buffering设置为1, 碰到换行就会将缓冲区的写入磁盘。 f=open(“demo.txt”,’w’,buffering=1) 1 1 无缓冲 : open 函数的buffering设置为0 有输入就写入磁盘。 f=open(“demo.txt”,’w,’,buffering=0) 1 1 缓冲的目的:是为了减少系统的io调用。只有当符合一定条件(比如缓冲数量)时才调用io

37,721

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧