1

整数を受け取ってファイルに保存するプログラムを作成する必要があります。15 (または 20、正確な数は関係ありません) になると、最初に書き込んだものを上書きします。それらは同じ行にある場合もあれば、それぞれが新しい行にある場合もあります。このプログラムはセンサーから温度を読み取り、それを PHP チャートのあるサイトに表示します。

たぶん30分ごとに値を書き込むことを考えました.15個の値があり、新しい値が来ると、最も古い値が上書きされます.

値の保存に問題があります。リストを新しい行を含む文字列として保存する方法がわかりません。2 つの新しい行が保存されます。Python は初めてで、本当に迷子になります。

これは機能しませんが、私がやりたいことの「サンプル」です:

import sys
import os

if not( sys.argv[1:] ):
    print "No parameter"
    exit()

# If file doesn't exist, create it and save the value
if not os.path.isfile("tempsHistory"):
    data = open('tempsHistory', 'w+')
    data.write( ''.join( sys.argv[1:] ) + '\n' )
else:
    data = open('tempsHistory', 'a+')
    temps = []
    for line in data:
        temps += line.split('\n')
    if ( len( temps ) < 15 ):
        data.write( '\n'.join( sys.argv[1:] ) + '\n' )
    else:
        #Maximum amount reached, save new, delete oldest
        del temps[ 0 ]
        temps.append( '\n'.join( sys.argv[1:] ) )
        data.truncate( 0 )
        data.write( '\n'.join(str(e) for e in temps) )
data.close( )

''.join や \n などで迷子になっています...つまり、[ '', ''] ではなく、リストを文字列として保存するには、join で記述する必要があります。'\n'.join を使用すると、2 倍のスペースを節約できると思います。前もって感謝します!

4

3 に答える 3

2

あなたが望むのは次のようなものだと思います:

import sys 

fileTemps = 'temps'

with open(fileTemps, 'rw') as fd:
    temps = fd.readlines()

if temps.__len__() >= 15:
    temps.pop(0)

temps.append(' '.join(sys.argv[1:]) + '\n')

with open(fileTemps, 'w') as fd:
    for l in temps:
        fd.write(l)

まず、読み取り用にファイルを開きます。fd.readlines() を呼び出すと、ファイル内の行が表示されます。次に、サイズを確認し、行数が 15 を超える場合は、最初の値をポップして新しい行を追加します。次に、すべてをファイルに書き込みます。

Python では、通常、ファイルから読み取ると (たとえば、readline() を使用して)、末尾に '\n' がある行が返されるため、二重の改行が発生します。

お役に立てれば。

于 2013-06-07T05:07:10.850 に答える
1

あなたは次のようなものが欲しい

values = open(target_file, "r").read().split("\n")
# ^ this solves your original problem as readline() will keep the \n in returned list items
if len(values) >= 15:
    # keep the values at 15
    values.pop()
values.insert(0, new_value)
# push new value at the start of the list
tmp_fd, tmp_fn = tempfile.mkstemp()
# ^ this part is important
os.write(tmp_fd, "\n".join(values))
os.close(tmp_fd)
shutil.move(tmp_fn, target_file)
# ^ as here, the operation of actual write to the file, your webserver is reading, is atomic
# this is eg. how text editors save files

とにかく、postgresql、redis、sqlite、またはボートに浮かぶものなら何でも、データベースの使用を検討することをお勧めします

于 2013-06-07T08:30:49.347 に答える