2015-01-27 7 views
0

У меня есть следующий код для чтения лог-файл из «коробки» в нашей сети:Есть построчный альтернатива для pycurl выполнения

import pycurl 
pycurl.Curl() 
pycurl_connect = pycurl.Curl() 
your_url = 'http://10.0.0.1:1333/cgi/WebCGI?7043' 
headers = ['Cookie: loginname=admin; password=e5T%7B%5CYnlcIX%7B; OsVer=2.17.0.32', 'Connection: keep-alive'] 
pycurl_connect.setopt(pycurl.URL, your_url) 
pycurl_connect.setopt(pycurl.HTTPHEADER, headers) 
pycurl_connect.perform() 

Файл журнала очень долго, и мне нужно только читать строки, которые не вошли в мою базу данных. Есть ли способ получить информацию поэтапно?

Спасибо.

+0

Нет на самом деле. Что вы можете сделать, это загрузить файл и кэшировать данные в базе данных sqlite. –

ответ

0

Я закончил тем, что использовал очень хакерское решение. Я разрешаю запрос curl сохранять данные в текстовый файл - это инициируется как поток демона, а остальная часть моей программы читается из этого файла «по очереди».

Некоторая гимнастика должна состояться, чтобы воспроизвести по очереди файл. Это в конечном итоге немного грязно, но это работает.

Вот код:

def write_logfile_as_thread(filename): 
    #Delete content in file 
    with open(filename, 'w') as file: pass 
    t = threading.Thread(target=write_logfile, args=(filename,)) 
    t.daemon = True 
    t.start() 
    return t 

def write_logfile(filename): 
    storage = open(os.path.join(filename), 'w') 
    pycurl.Curl() 
    pycurl_connect = pycurl.Curl() 
    your_url = 'http://10.0.0.1:1333/cgi/WebCGI?7043' 
    headers = ['Cookie: loginname=admin; password=e5T%7B%5CYnlcIX%7B; OsVer=2.17.0.32', 
       'Connection: keep-alive'] 
    pycurl_connect.setopt(pycurl.URL, your_url) 
    pycurl_connect.setopt(pycurl.HTTPHEADER, headers) 
    pycurl_connect.setopt(pycurl_connect.WRITEFUNCTION, storage.write) 
    pycurl_connect.perform() 
    pycurl_connect.close() 

def get_logfile_as_lines(filename): 
    #file read logic from http://stackoverflow.com/a/3290359/1490584 
    t = write_logfile_as_thread(filename) 
    file = open(filename) 
    text = "" 
    thread_is_alive = True 
    while (thread_is_alive): 
     thread_is_alive = t.is_alive() 
     where = file.tell() 
     chunk = file.read() 
     if not chunk: 
      file.seek(where) 
     else: 
      text += chunk 
      text_lines = text.split('\n') 
      if len(text_lines) > 1: 
       if thread_is_alive: 
        text = text_lines[-1] 
        new_lines = text_lines[:-1] 
       else: #The last line is complete 
        new_lines = text_lines 
       for line in new_lines: 
        yield line 

if __name__ == "__main__": 
    #print only the first 200 lines from the logfile 
    i = 0 
    for line in get_logfile_as_lines('logfile.txt'): 
     if i >= 200: 
      break 
     print line 
     i+=1