2016-12-22 8 views
1

ファイルの内容が更新されている間にそのファイルにアクセスしようとしています。以下は、書き込みが仕事を提出しない私のコードです:pythonがまだファイルを書き換えている間にファイルを読み込みます。

for i in range(100000): 
    fp = open("text.txt", "w") 
    fp.write(str(i)) 
    fp.close() 
    #time.sleep(1) 

私の問題は今、forループまだ実行されている間、私は私のファイルを開こうとするたびに、私は私は除いて(テキストエディタで空のファイルを取得するということです「更新された」番号を見る)。 forループが終了する前にファイルの内容を表示する方法があるのでしょうか?任意の助けを事前に

ありがとう:)

+0

何を見ますか? – DaveQ

+0

ファイルを開くたびに更新された番号が表示されることを期待しています。 –

+0

'fp = open(" text.txt "、" w ")を実行すると、ファイルの先頭にロールバックしてすべてを削除します。 'fp.flush()'のような "コミット"するまでは、そのままの状態になります。これはループ中のあなたの活動の大部分です。ファイルを開くと、そのような期間にいる可能性が非常に高く、何も表示されません。あなたは 'time.sleep(n)'を非常に小さな数に変更することができ、何も表示されません。 – DaveQ

答えて

4

は、forループの内側開かれていないファイルを実行してください。それは悪い習慣と悪いコードです。 新しいオブジェクトを作成するたびに毎回。だからあなたは空のファイルを取得します。

fp = open("text.txt", "r+") 
for i in range(100000): 
    fp.seek(0) 
    fp.write(str(i)) 
    fp.truncate() 
fp.close() 
+0

私は実際に新しい番号でファイルを更新しようとしています。 forループでファイルオープンを使うべきではないなら、他に何ができますか? –

+0

ファイルを消去する必要がある場合を除き、ファイルを消去することはできません。「空の」値の上書きを伴うコンテンツの場合 –

+0

私はあまり理解していません。ありがとうございます –

2

最新のオペレーティングシステムでは、パフォーマンスを向上させるためにファイル書き込みが行われます。連続した書き込みは、実際にディスクに書き込まれる前にまとめて処理されます。あなたは書き込みが即座にディスクに伝播したい場合は、使用方法flush()、それは劇的は、アプリケーションのパフォーマンスが低下ことを覚えておいてください:

with open("text.txt", "w") as fp: 
    for i in range(100000): 
    fp.write(str(i)) 
    fp.flush() 
0

ファイルに書き込むときまでには通常、実際にディスクに書き込まれません。ファイルが閉じられています。すぐに書きたい場合は、各繰り返しにflushを追加する必要があります。

fp = open("text.txt", "w") 
for i in range(100000): 
    fp.write(str(i)) 
    fp.write("\n") 
    fp.flush() 
fp.close() 
+0

私は実際にi番号でファイルを更新しようとしていますが、forループの終わりにスリープを追加すると、ファイルを開くと正常に動作します)、しかし時間がないまま寝る方法はありますか? –

+0

flush()は速くなります。睡眠を使うと、それはフラッシュされますが、あなたは時間を浪費しています。 – MotKohn

関連する問題