2016-06-14 1 views
0

私は所有しているフルーツの数を保持するファイルを持っています。最新の状態に保つために毎分編集する必要があります。ファイルを常時更新しています

apples: 3 
bananas: 6 
oranges: 12 
total: 21 fruits 

このファイルを編集するにはPythonを使用します。しかし、私はいくつかの問題に遭遇しました:

1)私は現在、次のように読み書きしています。

with open(file, 'r') as infile: 
    # read fruits that I have 
infile.close() 
with open(file, 'w') as outfile: 
    while True: 
     # update data and write to file 
outfile.close() 

より良い/より効率的な方法(メモリマッピングなし)がありますか? f.seek(offset、from_what)を使用してみましたが、これは独自の問題です(リンゴが1桁から2桁になるとファイルの残りの部分がスローされます)。

2)どのように変化しているのでしょうか?私は "tail -f"をやってみましたが、現在ファイルを編集しているので、新しいファイル全体全体を追加します。

3)私はいつもファイルを編集しているので、いつでも猫やヴィムにファイルをしようとすると、不完全です!理想的にはファイルを開き、そのファイル全体が表示され、更新されていることがわかります。

読んでいただきありがとうございます!

+0

somefile.close()を使用する必要はありません。with文は、スコープ外になったらそれを行います。ループを開始するたびにファイルを開く必要があります(coutless systemcallが発生し、速度が遅くなります)。どのような種類のデータを文字列や生のバイトで処理していますか?あなたはコードの残りの部分を投稿できますか? – wind85

+0

@ wind85私はStringsで働いています。 – ZtoYi

+1

'wb'はデータをバイトとして扱い、 'b'はバイナリモードを表します。 – wind85

答えて

0

ファイルを読み込み、果実の数を変数に解析することをお勧めします。次に、あなたの数学(3つのリンゴを加えるか何でも)を行い、ファイルを書き換えます。

おそらく、キーがあなたのフルーツの名前で、値がフルーツの数である辞書でこれを最もよく行うことができます。あなたのファイルを取り込んで辞書に書き込んだり、辞書をあなたの数学で更新したり、あなたの望む形式であなたの辞書をファイルに書き込む関数を書いたりする関数を書くだけです。これは比較的単純でなければなりません。

+0

これは私がやったことです。しかし、ポストに記載されている問題にぶつかりました。 – ZtoYi

+0

あなたが持っている問題を理解しているかどうかはわかりません。 1. seekを使用しないでください。readlines()とparseを使用してください。すべての読み上げと解析を行い、完全なファイルを書きます。一度に1つずつ値を編集しようとするのとは対照的です。 2-3。ファイルを開いたままにしないでください。毎分分だけ更新する必要があるので、毎分開いて編集してください。 – bravosierra99

1

'w +'または 'r +'モードを使用して読み書きできます。テキストモードでファイルを開くと、デフォルトで完全にバッファリングされます。ライブアップデートを確認するには、書き込みごとにflushを入力するか、ファイルをラインバッファモード(buffering=1)で開く必要があります。
さらに、tail -fはファイルが追加されないため使用できません。ライブアップデートを視聴するには、catを繰り返し呼び出す必要があります。したがって、watch cat fruits.txtとしてください。

ここでシナリオをシミュレートしました。

from time import sleep 

fruits = dict(apple=1, banana=2, orange=3) 
with open('fruits.txt', 'w+', buffering=1) as f: 
    for _ in range(20): 
     for fruit, count in fruits.items(): 
      f.write('{}: {}\n'.format(fruit, count)) 

     f.seek(0) 
     for line in f: 
      line = line.strip().split(':') 
      line[1] = int(line[1]) + 1 
      fruits.update((line,)) 
     f.seek(0) 
     sleep(1) 
関連する問題