2015-08-12 5 views
2

Я пытаюсь построить живой (и непрерывный) поток данных, который сбрасывается в csv из другой программы. Я получил сюжет, но потом понял, что мои данные были построены только до тех пор, пока я не выполнил код. Я считаю, что что-то не так с моей функцией синтаксического анализа (что-то новое в этом случае), но я не могу понять, что.Разбор фида данных в python

import threading 
import csv 
import dateutil.parser 
import datetime 
import time 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib import animation 

log = "sample.csv" 
data = "" 
mytime = "" 
thickness = "" 
times = "" 

#attempt at continuously reading my data source 
def parser(): 
    with open(log, 'r') as f: 
     global data 
     reader = csv.reader(f, delimiter=',')  
     data = reader.readlines() 
     time_thickness_data = [] 
     while 1: 
      last_pos = f.tell() 
      next_line = f.readline() 
      if not next_line: 
       time.sleep(1) 
       f.seek(last_pos) 
      else: 
       mytime, thickness = splitter(next_line) 
       time_thickness_data.append([mytime, thickness]) 

def splitter(line): 
    mytime = line[0] 
    thickness = line[3] 
    return (mytime, thickness) 
    times = [] 
    for date in mytime: 
     _ = dateutil.parser.parse(date) 
     times.append(datetime.datetime.strftime(_,'%H')) 

def main(): 
    a = threading.Thread(target=parser) 
    b = threading.Thread(target=splitter) 
    a.start() 
    b.start() 

if __name__ == "__main__": 
    main() 

#goes on to animated plot using times for x axis and thickness for y 
fig = plt.figure() 
axes = fig.add_subplot(111) 
line, = axes.plot([], [], '.') 
plt.show(block=False) #i had to use this to get my plot to show up 

def init(): 
    line.set_data([],[]) 
    return line, 

def animate(i): 
    a = 50 * i 
    xdata = times[:a] 
    ydata = thickness[:a] 
    line.set_data(xdata, ydata) 
    plt.draw() 
    axes.relim() 
    axes.autoscale_view(True,True,True) 
    return line, 

anim = animation.FuncAnimation(fig, animate, init_func=init, 
          interval=1, blit=True)       
plt.show() 

Пример строка из CSV-файла выглядит следующим образом: 2015-07-25 14:54:50.786774,1,0,439.85,,,,0,0,

+0

Можете ли вы установить некоторые данные? – dangonfast

+0

Где находится график, который вы хотите постоянно обновлять? – db1234

+0

Ну, я старался не делать это монстром, но я его отредактирую. – MBlankfield

ответ

1

Есть слишком много неиспользованных частей в вашем коде, чтобы действительно понять, что вы пытаетесь достичь. Вот простая функция, которая:

  • открывает CSV файл
  • неоднократно читать строки из него, ожидая новых линий, которые будут добавлены при достижении конца файла
  • вызывает функцию обратного вызова с декодированного списка из каждой строки CSV

    def csv_process(filename, callback, delay=1): 
        class waiter:  # wrapper around a file object to wait for new lines on EOF 
         def __init__(self, fd, delay=1): 
          self.fd = fd 
          self.delay = delay 
         def __iter__(self): 
          return self 
         def next(self): # try to read a line of wait delay seconds 
          while True: 
           line = fd.readline() 
           if line: 
            return line 
           time.sleep(self.delay) 
         def __next__(self): # ensure compatibility with Python3.x 
          return self.next() 
        with open(filename, "rb") as fd: 
         rows = csv.reader(waiter(fd, delay), delimiter=',') 
         for row in rows: 
          callback(row) 
    

python2 итераторы осуществляет next, а python3 те осуществляют __next__. Чтобы обеспечить совместимость с обоими, выше код определяет оба метода.

+0

Ваш код намного более компактен, чем мой, и я считаю, что он выполняет то же самое. Я все еще пытаюсь заставить его работать. Я определил имя файла и обратный вызов, но когда я запускаю код, я получаю сообщение об ошибке ccv.reader, в котором утверждается, что аргумент 1 должен быть итератором. Есть ли что-то, что мне нужно сделать вне функции с классом, который вы создали? – MBlankfield

+0

@MBlankfield: какую версию Python вы используете? –

+0

Я использую версию 3.4 – MBlankfield

Смежные вопросы