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()