入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

python 文件输出与重定向 ,输出的内容会在内存中暂存,不会立刻输出到文件中

创建时间:2015-11-19 投稿人: 浏览次数:4845

1、使用write写磁盘文件

python 中使用write,将数据写入到文件中,但是并不是write之后,就立刻写入到文件(比如a.txt)中,python的write会先将数据放在内存的缓冲区中,等到积累了一定的量,再一起写入到磁盘文件中。这样可以提高性能,减少访问磁盘的次数。总结一下,在程序中使用write写文件,数据不会立刻写入到文件中,也就是打开文件看不到刚才写入的数据,但是,使用flush(),可以将内存中的数据写入到磁盘文件中。

f = open("f.txt","w")
f.write("1,2,3")
while(1):
    pass
解析:如上的程序,你打开f.txt文件是看不到‘1,2,3"的,因为"1,2,3"还在内存的缓冲区中,并未写入到磁盘文件中。


f = open("f.txt","w")
f.write("1,2,3")
f.flush()
while(1):
    pass

解析:使用flush()可以将缓冲区中的数据立刻写入到磁盘文件中,打开文件可以看到"1,2,3"

f = open("f.txt","w")
f.write("1,2,3")
f.close()
while(1):
    pass
解析:当关闭文件时,内存缓冲区的数据也会写入到磁盘文件中。


总结1:

使用write写文件,数据先存放在内存的缓冲区,关闭文件,或使用flush(),或内存缓存区的数据积累到一定的量,就会将内存缓冲区的数据写入到文件中。


2、输出重定向

import sys
temp = sys.stdout
file = open("f.txt","w")
sys.stdout = file
print (1,2,3)
sys.stdout.close()
sys.stdout = temp
print (1,2,3)
解析:

1、temp = sys.stdout:标准输出管道

2、sys.stdout = file:将标准输出管道连到打开的文件

3、sys.stdout.close():关闭管道,所以,使用print 输出的数据,本来是存放在管道中,close()之后,全部写入文件中。

4、sys.stdout = temp:重新连接到标准的输出

上述程序执行后,输出“1,2,3”,f.txt中会写入"1,2,3"

管道存在于内存中,在管道创建时,为缓冲区分配一个页面大小。

重定向也存在跟write一样的问题,write写入的数据是先存在内存缓冲区中,使用flush或关闭文件,才写入到磁盘文件中。同理,重定向,print 输出的文件也存放在管道(应该是内存的某块区域),等管道关闭,或整个程序结束后,才写入到重定向的文件中。

import sys
temp = sys.stdout
file = open("f.txt","w")
sys.stdout = file
print (1,2,3)
while(1):
    pass


解析:print(1,2,3)之后,数据还在管道中,并未写入到内存中。所以在f.txt中看不到数据。

import sys
temp = sys.stdout
file = open("f.txt","w")
sys.stdout = file
print (1,2,3)
sys.stdout.close()
while(1):
    pass
解析:print(1,2,3)之后,使用sys,stdout.close()关闭管道,所以管道内的数据会写入到磁盘文件中。


一个疑问:

在一个程序中,既使用重定向,又使用write,那么就存在,从管道写入到磁盘文件,和内存缓冲区写入到磁盘文件两种情况,两种情况不好协调,所以,如果是这种情况,最好使用flush(),将数据立刻写入到磁盘文件中,不然,我们都不确定,是管道数据先写入磁盘文件,还是内存缓冲区的数据先写入到磁盘文件

import sys
temp = sys.stdout
file = open("f.txt","w")
sys.stdout = file
print (1,2,3)
sys.stdout.flush()
file.write("aaa")
file.flush()



 


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。