2014-01-14 2 views
2

У меня есть этот код:Python работать со словарем, файлы

def merge_new_old_urls(urls_list, urls_file_path): 
    url_dict = {} 
    try: 
     with open(urls_file_path, "r") as f: 
      data = f.readlines() 
     for line in data: 
      #read what is already in file 
      url_dict = { line.split()[0]: int(line.split()[1])} 
     for new in urls_list: 
      for key in url_dict.keys(): 
       if new == key: 
        print 'found' 
        url_dict[key] += 1 
       else: 
        url_dict[new] = 1 

    except IOError: 
     logging.critical('no files to read from %s' % urls_file_path) 
     raise IOError('no files to read from %s' % urls_file_path) 
    return url_dict 

Это должно считывать данные из файла и объединить его с новым списком данных, подсчитывая, сколько раз повторялось. Файл со старым URLs выглядит следующим образом:

http://aaa.com 1 
http://bbb.com 2 
http://ccc.com 1 

если новый список URL содержит http://aaa.comhttp://bbb.com ДИКТ должен быть:

'http://aaa.com':2 
'http://bbb.com':3 
'http://ccc.com':1 

Но мой код не работает правильно. Может кто-нибудь исцелить?

+2

Но мой код не работает правильно ... Что не так ?????? –

+0

Пожалуйста, определите, что «не работает правильно». Это порождает неправильный вывод, не выводит, исключение, ... –

+0

Почему вы сравниваете все ключи в словаре? Может ли словарь быстро найти метод? – Mark

ответ

2

Вы переопределять url_dict каждый раз через петлю:

url_dict = {line.split()[0]: int(line.split()[1])} 

Добавить записи в словарь вместо:

for line in data: 
    key, val = line.split() 
    if key in url_dict: 
     url_dict[key] += val 
    else: 
     url_dict[key] = val 

и поиск по словарю является совершенно ненужным, вы можете использовать те же синтаксис, как указано выше:

for key in urls_list: 
    if key in url_dict: 
     url_dict[key] += val 
    else: 
     url_dict[key] = val 

И, наконец, вы shoul dn't обернуть так много в try:

try: 
    with open(urls_file_path, "r") as f: 
     data = f.readlines() 
except IOError: 
    logging.critical('no files to read from %s' % urls_file_path) 
    raise IOError('no files to read from %s' % urls_file_path) 
else: 
    # rest of your code 
+0

спасибо большое, помог – user3156971

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