1

我需要制作一个接收整数并将其存储在文件中的程序。当它有 15(或 20,确切的数字无关紧要)时,它将覆盖它写入的第一个。它们可能在同一行,也可能在新行中。该程序从传感器读取温度,然后我将在带有 php 图表的站点上显示它。

我想过每半小时写一个值,当它有 15 个值并且有一个新值出现时,它会覆盖最旧的值。

我在保存值时遇到了麻烦,我不知道如何将列表保存为带有新行的字符串,它保存了双新行,我是 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,我认为它会节省双倍空间。先感谢您!

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 回答
0

您应该尽量不要将在列表中存储数据与在字符串中格式化相混淆。数据不需要“\n”

所以只是 temps.append(sys.argv[1:]) 就足够了。

此外,您不应自行序列化/反序列化数据。看看泡菜。这比你自己读/写列表要简单得多。

于 2013-06-07T04:56:08.197 回答