2013-06-06 4 views
0

У меня есть код, который в настоящее время распечатывает данные для каждого пользователя из XML-файла (полученного с веб-сайта) XML-обновлений, поскольку все больше пользователей взаимодействуют с ним на протяжении всего день. В настоящее время у меня есть свод кода для загрузки этих данных каждые 5 минут.Сопоставление идентификатора пользователя с файлом dict по сравнению с тем, если пользователь уже находится в dict

Каждый раз, когда код побежал он генерирует список пользователей и их статистика, первых 5 минут он печатает пользователь: х, у, г

вторые 5 минут он печатает пользователь:

x,y,z,a,b 

третьи 5 минут он печатает пользователь:

x,y,z,a,b,c,d 

Что мне нужно коды, чтобы сделать это, чтобы напечатать первые 5 минут:

x,y,z 

второй 5 минут:

a,b 

третий 5 минут:

c,d 

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

Прилагаю пример моего кода, в случае, если это помогает.

import mechanize 
import urllib 
import json 
import re 
import random 
import datetime 
from sched import scheduler 
from time import time, sleep 

######Code to loop the script and set up scheduling time 

s = scheduler(time, sleep) 
random.seed() 

def run_periodically(start, end, interval, func): 
    event_time = start 
    while event_time < end: 
     s.enterabs(event_time, 0, func,()) 
     event_time += interval + random.randrange(-5, 45) 
    s.run() 

###### Code to get the data required from the URL desired 
def getData(): 
    post_url = "URL OF INTEREST" 
    browser = mechanize.Browser() 
    browser.set_handle_robots(False) 
    browser.addheaders = [('User-agent', 'Firefox')] 

######These are the parameters you've got from checking with the aforementioned tools 
    parameters = {'page' : '1', 
       'rp' : '250', 
       'sortname' : 'roi', 
       'sortorder' : 'desc' 
      } 
#####Encode the parameters 
    data = urllib.urlencode(parameters) 
    trans_array = browser.open(post_url,data).read().decode('UTF-8') 

    xmlload1 = json.loads(trans_array) 
    pattern1 = re.compile('>&nbsp;&nbsp;(.*)<') 
    pattern2 = re.compile('/control/profile/view/(.*)\' title=') 
    pattern3 = re.compile('<span style=\'font-size:12px;\'>(.*)<\/span>') 



##### Making the code identify each row, removing the need to numerically quantify the  number of rows in the xmlfile, 
##### thus making number of rows dynamic (change as the list grows, required for looping function to work un interupted) 

    for row in xmlload1['rows']: 
     cell = row["cell"] 

##### defining the Keys (key is the area from which data is pulled in the XML) for use in the pattern finding/regex 

     user_delimiter = cell['username'] 
     selection_delimiter = cell['race_horse'] 


     if strikeratecalc2 < 12 : continue; 

##### REMAINDER OF THE REGEX DELMITATIONS 
     username_delimiter_results = re.findall(pattern1, user_delimiter)[0] 
     userid_delimiter_results = (re.findall(pattern2, user_delimiter)[0]) 
     user_selection = re.findall(pattern3, selection_delimiter)[0] 



##### Printing the results of the code at hand 

     print "user id = ",userid_delimiter_results 
     print "username = ",username_delimiter_results 
     print "user selection = ",user_selection 
     print "" 





    getData() 


    run_periodically(time()+5, time()+1000000, 3000, getData) 

Мне сообщили, что это может быть достигнуто с помощью цитаты:. «В Dict, который отображает user_id на данные объекта, содержащего пользователя На каждом ходу скребка, проверьте идентификатор пользователя уже в Словаре, и если так обновлять соответствующий объект, в противном случае добавить новую запись в dict. " Если бы кто-нибудь мог предоставить какой-то примерный код для такой проблемы, я смогу его обработать для решения моего кода.

С уважением и большое спасибо AEA

+0

проще всего было бы сохранить список всех пользователей ids, и если идентификатор уже существует, ничего не печатайте. – pypat

+0

@FMc Привет, FMc, я пытаюсь использовать эту кодировку на python в течение 12 дней, я боюсь, что без какого-либо примера работать или реконструировать, я не знаю, с чего начать!: s С уважением, AEA – AEA

ответ

3

можно следить за user_id s вы уже выводятся в списке, но это может быть проще просто вспомнить позицию в списке вы последний слева выключение - то есть, если вы уже выведете первых 5 пользователей на предыдущих запусках, начните с номера строки 6 в следующем прогоне. Вы можете осуществить это в цикле, как:

#outside of the run loop 
number_output = 0 

#in the run lop 
for row in xmlload1['rows'][number_output:]: 
    number_output += 1 
    cell = row["cell"] 

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

my_set.update(username) 

и проверить, если пользователь уже имеет на выходе с

if username in my_set: 
    ... 
+0

Эй, спасибо за ответ Майкл, однако список сортируется по ROI, это означает, что любые новые пользователи, регистрирующие свои данные, могут заменить пользователя, который является строкой 3. Например, до 3 пользователей сопротивлялись, с ROI 5 % 10% и 12% эти пользователи будут перечислены строка 1 12% строка 2 10% строка 3 5%. После второй царапины xml пользователь зарегистрировал свои данные с ROI 7%, он будет введен в строку три, перемещая старого пользователя в строке 3. Надеюсь, это имеет смысл. – AEA

+1

@AEA, если пользователи не заказываются, тогда подходит подход с использованием 'set' (вторая половина моего ответа). Этот подход аналогичен вашему предложению использовать dict, но больше памяти и времени. –

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