2013-11-13 3 views
1

Я пишу класс взять файл Chrome закладок (смотрите пример ниже):Как динамически создать путь/ссылку на вложенный словарь в Python

{ 
    "checksum": "452bebcad611a3faffb2c009099139e5", 
    "roots": { 
     "bookmark_bar": { 
     "children": [ { 
      "date_added": "13028719861473329", 
      "id": "4", 
      "name": "first bookmark", 
      "type": "url", 
      "url": "chrome://newtab/" 
     }, { 
      "children": [ { 
       "children": [ { 
        "date_added": "13026904508000000", 
        "id": "7", 
        "name": "Getting Started", 
        "type": "url", 
        "url": "https://www.mozilla.org/en-GB/firefox/central/" 
       } ], 
       "date_added": "13028740260032410", 
       "date_modified": "0", 
       "id": "6", 
       "name": "Bookmarks Toolbar", 
       "type": "folder" 
      }, { 
       "children": [ { 
        "date_added": "13026904508000000", 
        "id": "9", 
        "name": "Help and Tutorials", 
        "type": "url", 
        "url": "https://www.mozilla.org/en-GB/firefox/help/" 
       }, { 
        "date_added": "13026904508000000", 
        "id": "10", 
        "name": "Customise Firefox", 
        "type": "url", 
        "url": "https://www.mozilla.org/en-GB/firefox/customize/" 
       }, { 
        "date_added": "13026904508000000", 
        "id": "11", 
        "name": "Get Involved", 
        "type": "url", 
        "url": "https://www.mozilla.org/en-GB/contribute/" 
       }, { 
        "date_added": "13026904508000000", 
        "id": "12", 
        "name": "About Us", 
        "type": "url", 
        "url": "https://www.mozilla.org/en-GB/about/" 
       } ], 
       "date_added": "13028740260032410", 
       "date_modified": "0", 
       "id": "8", 
       "name": "Mozilla Firefox", 
       "type": "folder" 
      }, { 
       "date_added": "13026904551000000", 
       "id": "13", 
       "name": "Welcome to Firefox", 
       "type": "url", 
       "url": "http://www.mozilla.org/en-US/firefox/24.0/firstrun/" 
      } ], 
      "date_added": "13028740260004410", 
      "date_modified": "0", 
      "id": "5", 
      "name": "Imported From Firefox", 
      "type": "folder" 
     } ], 
     "date_added": "13028719626916276", 
     "date_modified": "13028719861473329", 
     "id": "1", 
     "name": "Bookmarks bar", 
     "type": "folder" 
     }, 
     "other": { 
     "children": [ ], 
     "date_added": "13028719626916276", 
     "date_modified": "0", 
     "id": "2", 
     "name": "Other bookmarks", 
     "type": "folder" 
     }, 
     "synced": { 
     "children": [ ], 
     "date_added": "13028719626916276", 
     "date_modified": "0", 
     "id": "3", 
     "name": "Mobile bookmarks", 
     "type": "folder" 
     } 
    }, 
    "version": 1 
} 

преобразовать из JSON в гнездовой словарь затем извлеките URL-адрес закладки в каждой соответствующей папке с закладками в моем методе write_data.

Как может быть любое количество папок для закладок и/или закладок, вложенных в каждую папку, я хочу вызвать метод write_data внутри себя, чтобы он продолжал извлекать дочерние данные каждый раз, когда находит вложенную папку. Я просто не могу понять, как передать соответствующие дочерние словари в один и тот же метод.

Я попытался построить путь словаря со строкой. Я думаю, мне нужно пройти в кортеж или список ключей, чтобы прокручивать и динамически наращивать путь, но я не могу заставить его работать, а моя бедная голова разрушена!

Существует similar question, но ответ использует yield, который полностью смутил меня и не был полностью рабочим решением. Пожалуйста помоги!

import json 
import sys 
import codecs 


class FileExtractor(object): 
    def __init__(self, input_file): 
     self.infile = codecs.open(input_file, encoding='utf-8') 
     self.bookmark_data = json.load(self.infile) 

    def write_data(self, my_key): 

     for key, value in self.bookmark_data[my_key].iteritems(): 
      if type(self.bookmark_data[my_key][key]) is dict: 
       print self.bookmark_data[my_key][key]['name'] 
       for subkey, subvalue in self.bookmark_data[my_key][key].iteritems(): 
        if subkey == "children" and len(self.bookmark_data[my_key][key][subkey]) <> 0: 
         print "this is a child. I can't figure out how to use write_data with this" 
         #self.write_data('[my_key][key][subkey]')    
        else: 
         print subkey, ": ", self.bookmark_data[my_key][key][subkey] 

if(__name__=="__main__"): 
    stuff= FileExtractor(sys.argv[1]) 

    stuff.write_data(('roots')) 
+1

Я не понял, что именно вы пытаетесь достичь. Можете ли вы опубликовать свой желаемый результат? – georg

+0

спасибо thg435. то, что я пытаюсь получить, - это список закладок и их атрибутов, имя, дата и т. д. под заголовком каждой папки/подпапки. Я также хочу указать атрибуты папки, имя, дату и т. Д. – CiCi

ответ

0

Не уверен, если это то, что вы получаете на, но если вы передаете объект словаря себя write_data вместо ключа вы можете RECURSE, как далеко вниз, как словарь идет. ПРЕДУПРЕЖДЕНИЕ Я не тестировал это, это просто дать вам представление.

def write_data(self, my_dict=None): 
    my_dict = my_dict or self.bookmark_data['roots'] 
    for key, value in my_dict.items(): 
     if type(my_dict[key]) is dict: 
      print my_dict[key]['name'] 
      for subkey, subvalue in my_dict[key].items(): 
       if subkey == "children" and len(my_dict[key][subkey]) <> 0: 
        for child in my_dict[key][subkey]: 
         self.write_data(child)   
       else: 
        print subkey, ": ", my_dict[key][subkey] 

лучшая версия:

def write_data(self, my_dict=None): 
    my_dict = my_dict or self.bookmark_data['roots'] 
    if 'name' in my_dict: 
     print my_dict['name'] 

    for key, value in my_dict.items(): 
     if type(my_dict[key]) is dict: 
      self.write_data(my_dict[key]) 
     elif type(my_dict[key]) is list: 
      for item in my_dict[key]: 
       self.write_data(item) 
     else: 
      print key, ": ", my_dict[key] 
+0

Большое спасибо dgalvin. Я попытался это сделать, но при попытке передать весь объект: Я прочитал следующий результат: Traceback (последний последний звонок): Файл «./file_extractor.py», строка 48, в stuff.write_data (self.bookmark_data ['roots']) NameError: name 'self' не определен – CiCi

+0

, возможно, не передаются в self.bookmark_data ['roots'] изначально просто используют это, если my_dict - None, я отредактирую ответ. Вы в основном пытаетесь использовать себя вне класса, вместо этого используйте stuff.bookmark_data, чтобы ссылаться на экземпляр. – gonkan

+0

Это хорошо работает dgalvin, спасибо за попытку, но по какой-то причине он на самом деле не распечатывает атрибуты закладок под bookmark_bar – CiCi

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