python 文件输出与重定向 ,输出的内容会在内存中暂存,不会立刻输出到文件中
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()