3

f=open('ファイル名','モード')

'w' モードはファイルを作成し、それを書き込み用に開きます (最終的に同じファイル オブジェクトを使用して読み取ることができません) 'r+' モードは読み取りと書き込みの両方のためにファイルを開きますが、ファイルがまだ存在しない場合は作成しません。代わりに新しいものを使用すると、エラーが返されます。

ここで、シナリオを考えてみましょう...ファイルを作成し、読み取りと書き込みの両方で開きたい..

ここにそれを行う1つの方法があり、それはうまくいきます...

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」の呼び出しが必要です。 .

ファイルの最後までシークしない限り、再度書き込むときに既存のデータを上書きできることに注意してください。ファイルにデータを追加するだけの場合は、「w+」の代わりに「a+」モードを使用できます。

于 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'

まだ私の他の2つの質問は答えられていません..

f2.read() 関数は、ディスクから直接読み取ろうとしますか、それともファイルの既に利用可能なバッファ キャッシュから読み取ろうとしますか?

更新されたファイルはいつディスクに書き戻されますか?

すぐに見つかります...

于 2013-08-11T19:36:17.000 に答える