2012-12-04 83 views
0

我有一個文件每60秒更新一次數據。 我希望能夠從文件底部向後讀取,以便我可以將最近6小時的數據繪製成圖形。如何在Python中使用numpy.genfromtxt從底部讀取文件

我能夠讀取前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') 
+0

你知道多少行的文件中,當你開始? –

+0

你必須使用numpy.genfromtxt – enginefree

+0

你知道'tail'嗎? – wim

回答

0

如果你沒有使用numpy.genfromtxt(),如果文件的行是恆定的長度(或慢或不高度可變的改變),你可以計算的偏移量,並使用file.seek()去那所抵消。例如,使用os.stat()找出文件大小,減去360倍平均線長加上緩衝,尋找,讀取。

使用numpy.genfromtxt(),你大概可以使用skip_header參數指定多少行讀取數據之前向後跳躍。例如,讀取文件的第一行以查明文件何時開始,並計算自那時起的分鐘數。假設它是minutesOld分鐘。在genfromtxt()參數列表中說skip_header = minutesOld - 360

因此,您不必一次跳過大量行,可以在同一genfromtxt調用中獲取時間和臨時數據。要做到這一點,說(例如)

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

人們可以通過usecols設置或通過dtype設定獲得相同的呼叫時間和溫度數據;請參閱genfromtxt Examples文檔。下面顯示的代碼說明了前者。這個例子的溫度記錄文件有大約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)] 
+0

感謝您的回覆。我要用你的邏輯,它運作良好 – Mwilliams03

相關問題