3

f=open('文件名','模式')

'w' 模式将创建一个文件并打开它以进行写入(最终您无法使用相同的文件对象进行读取) 'r+' 模式将打开文件以进行读取和写入,但是如果文件尚未存在,它将不会创建一个新的,而不是它会返回错误。

现在考虑这个场景......我想创建一个文件并希望打开它以进行读取和写入..

这是一种方法,它确实有效......

f = open('filename', 'w')
f.close()
f = open('filename', 'r+')

我尝试了另一种不同的方式..

>>> f1 = open('filename','w')
>>> f2 = open('filename', 'r')
>>> f1.write('test string')
11
>>> f2.read()
''
>>> f1.close()
>>> f2.read()
'test string'

是的,它没有按我预期的方式工作(类似于管道)

我的问题是

函数会f2.read()尝试直接从磁盘读取还是从文件的现有缓冲区缓存中读取?

更新后的文件何时会写回磁盘?很明显,f1.close()它将从内存缓冲区更新磁盘中的文件。但是有没有办法手动强制磁盘写入?

所以它会按如下方式工作

f1.write('test string')
#force disk write
f2.read('test string') #now it should read correct data
4

2 回答 2

4

您可以使用 'open(filename, "w+")' 打开文件进行读写:

>>> f = open('hello.txt', 'w+')
>>> f.write('hello world\n')
12
>>> f.seek(0)
0
>>> f.read()
'hello world\n'
>>> 

需要调用“seek”,因为文件对象具有一个用于读取和写入的“当前位置”,对 seek 的调用会将当前文件位置重置为文件的开头,以便可以读取您刚刚编写的内容.

请注意,您可以在再次写入时覆盖现有数据,除非您返回文件末尾。如果您只想将数据附加到文件中,您可以使用模式“a+”而不是“w+”。

于 2013-06-28T07:07:17.003 回答
1

文件数据可以通过使用刷新而无需关闭f.flush()

现在我想要的类似管道的行为可以实现如下

>>> f1 = open('filename','w')
>>> f2 = open('filename', 'r')
>>> f1.write('test string')
11
>>> f1.flush()
>>> f2.read()
'test string'

我的其他两个问题仍然没有答案..

f2.read() 函数会尝试直接从磁盘读取还是从文件的现有缓冲区缓存中读取?

更新后的文件何时会写回磁盘?

我很快就会找到它...

于 2013-08-11T19:36:17.000 回答