如何在python中使用numpy.genfromtxt从底部读取文件

时间:2012-12-04 05:08:04

标签: python numpy matplotlib genfromtxt

我有一个文件,每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')

1 个答案:

答案 0 :(得分:0)

如果您不必使用numpy.genfromtxt(),并且文件行长度恒定(或缓慢变化或变化不大),您可以计算偏移量并使用file.seek()来获取抵消了。例如,使用os.stat()查找文件大小,减去平均线长度的360倍加上缓冲,搜索,读取。

使用numpy.genfromtxt(),您可以使用skip_header参数指定在读取数据之前要跳过的行数。例如,读取文件的第一行以找出文件何时开始,并计算自该时间以来的分钟数。假设它是minutesOld分钟。在skip_header = minutesOld - 360参数列表中说genfromtxt()

因此,您不必两次跳过很多行,在同一genfromtxt调用中获取时间和临时数据。要做到这一点,请说(例如)

data = numpy.genfromtxt(t_in, dtype=None, usecols=(0,1), skip_header = minutesOld - 360)

可以通过usecols设置或dtype设置在同一通话中获取时间和临时数据;请参阅genfromtxt Examples docs。下面的代码说明了前者。此示例的温度记录文件中包含大约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)]