Как прочитать словарь в словаре?

Мне нужно узнать значение text

d = dict()
d = {'ans':{'anf':{'atributes':{'text':'res'}}}}
print(d.ans.anf.atributes['text'])
AttributeError: 'dict' object has no attribute 'ans' 

Ответы (3 шт):

Автор решения: CrazyElf
print(d.ans.anf.atributes['text'])

Такое работает только в библиотеках, например Pandas, которые автоматически делают у объекта поля, к которым можно обращаться и так df['field'] и так df.field, с обычными словарями это не работает, к ним надо обращаться через индексирование (квадратные скобки):

print(d['ans']['anf']['atributes']['text'].lower())
→ Ссылка
Автор решения: Dmitry

Или через метод get()

print(d.get("ans").get("anf").get("atributes").get("text"))

Есть некоторое отличие от данной d["ans"]... конструкции. Например, не выкидывает исключение, если не найден ключ. Но выкинет исключение, если не существует ключ в середине директивы. Например,

# все ок
>>> d = {'ans':{'anf':{'atributes':{'text':'res'}}}}
>>> print(d.get("ans").get("anf").get("atributes").get("text"))
res 

# не существует последнего ключа
>>> d = {'ans':{'anf':{'atributes':{'1':'res'}}}}     
>>> print(d.get("ans").get("anf").get("atributes").get("text"))
None

# не существует anf-ключа
>>> d = {'ans':{'1':{'atributes':{'text':'res'}}}}   
>>> print(d.get("ans").get("anf").get("atributes").get("text"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'get'
→ Ссылка
Автор решения: Andy Pavlov

Если известно, что ключ есть, но не известно, где он, то можно поиском по словарю пройтись в таком виде:

def search_dict(data: dict, key: str):
    res = None
    for k, v in data.items():
        if k == key:
            res = v
        if isinstance(v, dict):
            res = search_dict(v, key)
    return res

d = {'ans':{'anf':{'atributes':{'text':'res'}}}}
print(search_dict(d, 'text'))
→ Ссылка