我有一个文件,每60秒更新一次,其中包含一些数据。我希望能够从文件的底部向后读取,这样我就可以将最后6个小时的数据绘制成一张图。
我能够读取前360行(见下文),但这是旧数据。我希望能够查看文件的底部360行,这是最新的数据。我不知道该怎么做。有人能帮忙吗?
import numpy,itertools, matplotlib,datetime
with open('temperature_logging') as t_in:
temp = numpy.genfromtxt(itertools.islice(t_in,360),dtype=None,usecols=(0))
time = numpy.genfromtxt(itertools.islice(t_in,360),dtype=None,usecols=(1))
dates = matplotlib.dates.datestr2num(time)
pylab.savefig('graph.png')
如果不必使用numpy.genfromtxt()
,并且文件行的长度不变(或变化缓慢或变化不大),则可以计算偏移量,并使用file.seek()
来获得该偏移量。例如,使用os.stat()
找出文件大小,减去360倍平均行长度加上缓冲区,查找,读取。
使用numpy.genfromtxt()
,您可能可以使用skip_header
参数来指定在读取数据之前要向前跳过的行数。例如,读取文件的第一行以了解文件开始的时间,并计算自该时间以来的分钟数。假设是minutesOld
分钟。在genfromtxt()
参数列表中说出skip_header = minutesOld - 360
。
这样您就不必跳过两次整行,在同一个genfromttxt调用中获取时间和临时数据。要做到这一点,请说(如)
data = numpy.genfromtxt(t_in, dtype=None, usecols=(0,1), skip_header = minutesOld - 360)
可以通过usecols
设置或通过dtype
设置获得同一呼叫中的时间和温度数据;请参阅genfromtxt示例文档。下面显示的代码说明了前者。本例的温度日志文件中大约有1234行,时间没有附带日期。相反,时间一直在倒数24点。调整用于计算文件中行数的代码,使其与您自己的时间表示约定相匹配。
from numpy import genfromtxt
from itertools import islice
from time import localtime, time
toKeep = 20
with open('temperature_logging') as fin:
start = genfromtxt(islice(fin,1), dtype=None, usecols=(0,1))
hf, mf = map(int, start.tolist()[0].split(':'))
ti = localtime(time())
hn, mn = ti.tm_hour, ti.tm_min
print 'File start: {:02d}:{:02d}, Time Now: {:02d}:{:02d}'.format(hf, mf, hn, mn)
minutesOld = (hn-hf)*60 + mn-mf
if minutesOld < 0: minutesOld += 24*60
data = genfromtxt(fin, dtype=None, usecols=(0,1), skip_header = minutesOld - toKeep)
print data
以下是上面代码的输出示例:
File start: 03:43, Time Now: 00:16
[('23:57', 66.3) ('23:58', 66.8) ('23:59', 66.7) ('24:00', 67.1)
('24:01', 66.7) ('24:02', 67.1) ('24:03', 66.8) ('24:04', 67.2)
('24:05', 67.4) ('24:06', 67.7) ('24:07', 67.3) ('24:08', 67.1)
('24:09', 66.8) ('24:10', 67.3) ('24:11', 67.8) ('24:12', 67.3)
('24:13', 67.6) ('24:14', 67.6) ('24:15', 67.7) ('24:16', 67.3)]