Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tail读取一个不断增长的动态文件,提取两列,然后打印一个图形_Python_Graph_Tail_Matplotlib - Fatal编程技术网

Python Tail读取一个不断增长的动态文件,提取两列,然后打印一个图形

Python Tail读取一个不断增长的动态文件,提取两列,然后打印一个图形,python,graph,tail,matplotlib,Python,Graph,Tail,Matplotlib,读取记录了时间序列数据的1GB文件并生成包含两列(一列是时间,另一列是数字)的实时图形的最佳方法是什么?我发现你有不同的方法来跟踪文件。听起来对你来说是个不错的工作 但是如果您想继续使用Python,我会使用tail将数据流传输到我的程序中(这是假设文件是连续写入的,否则Python中的直接open()将起作用) myprogram.py的外观可能类似于: import sys p = ... # create a pylab plot instance for line in sys.st

读取记录了时间序列数据的1GB文件并生成包含两列(一列是时间,另一列是数字)的实时图形的最佳方法是什么?我发现你有不同的方法来跟踪文件。

听起来对你来说是个不错的工作

但是如果您想继续使用Python,我会使用tail将数据流传输到我的程序中(这是假设文件是连续写入的,否则Python中的直接open()将起作用)

myprogram.py的外观可能类似于:

import sys

p = ... # create a pylab plot instance 
for line in sys.stdin:
    elements = line.split(',') # or whatever separator your file has in it
    p.add(element[0], element[1]) # add data to the pylab plot instance

正如John提到的,您可以将尾部输出输入到您的文件中,但是如果您出于某种原因想要处理文件中的所有内容,并且还想要一个有点动态的图形示例,那么这里就是

import math
import time
import pylab  

def getDataTest(filePath):
    s = 0
    inc = .05
    x_list=pylab.arange(0, 5.0, 0.01)
    while 1:
        s += inc
        if abs(s) > 1:
            inc=-inc

        y_list = []
        for x in x_list:
            x += s
            y = math.cos(2*math.pi*x) * math.exp(-x)
            y_list.append(y)

        yield x_list, y_list

def tailGen(filePath):
    f = open(filePath)
    #f.seek(0, 2) # go to end
    for line in f: yield line
    while 1:
        where = f.tell()
        line = f.readline()
        if line:
            yield line
        else:
            time.sleep(.1)
            f.seek(where)

def getData(filePath):
    x_list = []
    y_list = []
    maxCount = 10
    for line in tailGen(filePath):
        # get required columns
        tokens = line.split(",")
        if len(tokens) != 2:
            continue
        x, y = tokens
        x_list.append(x)
        y_list.append(y)
        if len(x_list) > maxCount:
            x_list = x_list[-maxCount:]
            y_list = x_list[-maxCount:]
            yield x_list, y_list

pylab.ion()
pylab.xlabel("X")
pylab.ylabel("Y")

dataGen = getData("plot.txt") # getDataTest("plot.txt") #
x_list, y_list = dataGen.next()
plotData, = pylab.plot(x_list, y_list, 'b')
#pylab.show()
pylab.draw()
for (x_list, y_list) in dataGen:
    time.sleep(.1)
    plotData, = pylab.plot(x_list, y_list, 'b')
    pylab.draw()

您可以从中提取元素,我认为这将解决您的问题。

这是unix管道,它有三个部分:尾部、过滤器(gawk)和绘图仪(python)

这是python脚本。您可以向它提供1(y)或2(x y)列数据。如果不使用
gawk
,请务必弄清楚如何禁用缓冲<例如,code>sed-u

pa-poca$ cat ~/tailplot.py

import math
import time
import sys
import pylab

pylab.ion()
pylab.xlabel("X")
pylab.ylabel("Y")

x = []
y = []
counter = 1
while True :
    line = sys.stdin.readline()
    a = line.split()
    if len(a) == 2:
      x.append(a[0])
      y.append(a[1])
    elif len(a) == 1:
      x.append(counter)
      y.append(a[0])
      counter = counter + 1
    pylab.plot(x, y, 'b')
    pylab.draw()
tail -f yourfile.log | gawk '/PCM1/{print $21; fflush();}' | python -u tailplot.py
pa-poca$ cat ~/tailplot.py

import math
import time
import sys
import pylab

pylab.ion()
pylab.xlabel("X")
pylab.ylabel("Y")

x = []
y = []
counter = 1
while True :
    line = sys.stdin.readline()
    a = line.split()
    if len(a) == 2:
      x.append(a[0])
      y.append(a[1])
    elif len(a) == 1:
      x.append(counter)
      y.append(a[0])
      counter = counter + 1
    pylab.plot(x, y, 'b')
    pylab.draw()