我正在使用python收集温度数据,但只想存储最近24小时的数据。
我目前正在以此生成我的.csv文件
while True:
tempC = mcp.temperature
tempF = tempC * 9 / 5 + 32
timestamp = datetime.datetime.now().strftime("%y-%m-%d %H:%M ")
f = open("24hr.csv", "a")
f.write(timestamp)
f.write(',{}'.format(tempF))
f.write("\n")
f.close()
.csv看起来像这样
此输出的.csv如下
18-12-13 10:58 ,44.7125
18-12-13 11:03 ,44.6
18-12-13 11:08 ,44.6
18-12-13 11:13 ,44.4875
18-12-13 11:18 ,44.6
18-12-13 11:23 ,44.4875
18-12-13 11:28 ,44.7125
我不想滚动,只保留最近24小时的数据。由于我每5分钟采样一次数据,因此24小时后我应该在CSV中以144行结尾。因此,如果我使用readlines(),我可以告诉我有多少行,但是如何摆脱24小时以上的行呢?这是我想出的,显然不起作用。有建议吗?
f = open("24hr.csv","r")
lines = f.readlines()
f.close()
if lines => 144:
f = open("24hr.csv","w")
for line in lines:
if line <= "timestamp"+","+"tempF"+\n":
f.write(line)
f.close()
答案 0 :(得分:0)
您已经完成了大部分工作。我有一些建议。
force
。这意味着如果程序中途出现错误并且引发了异常,则文件将被正确关闭。with
检查len
的长度。这是修改后的程序:
list
此代码不是很干净(不符合PEP-8),但是您会看到一般过程。
答案 1 :(得分:0)
您使用linux吗?如果您需要最后144行,可以尝试
tail -n 144 file.csv
您也可以在窗户上找到尾巴,我用CMDer弄到了。 如果您必须使用python并且您有适合RAM的小文件,请使用readlines()将其加载到列表中,将其剪切(lst = lst [:144])并重写。如果您不知道自己有多少行,请使用https://docs.python.org/3.7/library/csv.html进行解析,然后将时间解析为python datetime(类似于u原始写入时间),然后按条件写入行
答案 2 :(得分:0)
鉴于288行不会占用太多内存,我认为只读取行,截断文件并放回所需的行就可以了:
# Unless you are working in a system with limited memory
# reading 288 lines isn't much
def remove_old_entries(file_):
file_.seek(0) # Just in case go to start
lines = file_.readlines()[-288:] # Read the last 288 lines
file_.truncate(0) # Empty the file
file_.writelines(lines) # Put back just the desired lines
return _file
while True:
tempC = mcp.temperature
tempF = tempC * 9 / 5 + 32
timestamp = datetime.datetime.now().strftime("%y-%m-%d %H:%M ")
with open("24hr.csv", "r+") as file_:
file_ = remove_old_entries(file_) # Consider that the function will return the file at the end
file_.write('{},{}\n'.format(timestamp, tempF))
# I hope mcp.temperature is blocking or you are sleeping out the 5min
# else this file reading in an infinite loop will get out of hand
# time.sleep(300) # Call me maybe
答案 3 :(得分:0)
如果您使用的是Linux或类似操作系统,正确的方法是实施logrotaion