0

アプリケーションが数秒ごとに更新するファイルがあり、そのファイルから単一の数値フィールドを抽出し、後で使用するためにリストに記録したいと考えています。そこで、スクリプトがソース ファイルを読み取る無限ループを作成し、特定の Figure の変更に気付くたびに、その Figure を出力ファイルに書き込みたいと思います。

ソースファイルが変更されていることをPythonに認識させられない理由がわかりません:

#!/usr/bin/python

import re
from time import gmtime, strftime, sleep



def write_data(new_datapoint):
        output_path = '/media/USBHDD/PythonStudy/torrent_data_collection/data_one.csv'
        outfile = open(output_path, 'a')
        outfile.write(new_datapoint)
        outfile.close()


forever = 0
previous_data = "0"

while forever < 1:
        input_path = '/var/lib/transmission-daemon/info/stats.json'
        infile = open(input_path, "r")
        infile.seek(0)
        contents = infile.read()

        uploaded_bytes = re.search('"uploaded-bytes":\s(\d+)', contents)

        if uploaded_bytes:
                current_time = strftime("%Y-%m-%d %X", gmtime())
                current_data = uploaded_bytes.group(1)
                if current_data != previous_data:
                        write_data(","+ current_time + "$" + uploaded_bytes.group(1))
                        previous_data = uploaded_bytes.group(1)
                infile.close()
                sleep(5)
        else:
                print "couldn't write" + strftime("%Y-%m-%d %X", gmtime())
                infile.close()
                sleep(60)

現在のように、(乱雑な) スクリプトは 1 回正しく記述され、その後、ソース ファイル (stats.json) ファイルが変更されているにもかかわらず、スクリプトが変更を検出しないことがわかります。実行し続けますが、出力ファイルが大きくなりません。

anopen()と aでうまくいくと思い、 aclose()を投入してみました.seek(0)

Python がソース ファイル (stats.json) を再度開いて再度読み取るようにするために、どのファイル メソッドが欠落していますか?

4

5 に答える 5

1

私が見る2つの問題:

  1. あなたのファイルは本当にファイルシステム上で更新されていますか? どのオペレーティング システムでコードを再生しているかはわかりませんが、この場合、ファイルが Producer によってフラッシュされていない場合、キャッシングによって a$$ がキックされる可能性があります
  2. あなたの問題は、ファイルではなくパイプを検討する価値がありますが、消費者が死んでいるtransmission場合にパイプへの書き込みに固執した場合にどうなるかは保証できません。

問題に答えるには、次のいずれかを使用することを検討してください。

これらのモジュールは、ファイルシステムの変更を監視し、適切なアクションを呼び出すことを目的としています。あなたの例の方法は原始的であり、パフォーマンスが大幅に低下し、他の回答で既に言及されている他の問題がいくつかあります。

于 2013-06-11T14:54:59.587 に答える
1

Ilya、ファイルを処理する前に stats.json が変更されたどうかを確認するのに役立ちますか?

さらに、JSON ファイルであるという事実を利用することをお勧めします。

import json
import os
import sys

dir_name ='/home/klaus/.config/transmission/' 
# stats.json of daemon might be elsewhere

file_name ='stats.json'
full_path = os.path.join(dir_name, file_name)

with open(full_path) as fp:
    json.load(fp)
    data = json.load(fp)
    print data['uploaded-bytes']
于 2013-06-11T15:59:44.143 に答える
0

残念ながら、私のエラーはシェルにあり、Pythonのスクリプトにはありませんでした。

問題の原因は、スクリプトをバックグラウンドに置いていた方法であることが判明しました。私がしていCtrl+Zたのは、タスクをバックグラウンドに置くことだと思った. しかし、そうではなく、Ctrl+Zタスクを一時停止してシェルに戻すだけですbg。スクリプトをバックグラウンドで無限ループで実行するには、後続のコマンドが必要です。

于 2013-06-11T21:56:55.493 に答える