@Midzakikayo

Не получается дополнить запись внесённую в файл. Что делаю не так?

Добра всем! Недавно начал учить Python для общего развития и сейчас прохожу курсы. Столкнулся с проблемой при решении задачки.

Нужно через консоль передать параметры Ключ:Значение и сохранить их в файле. Далее при обнаружении ключа дополнить коллекцию значений. Записать и получить значения получается а вот при попытке дополнить выпадает ошибка.
AttributeError: 'str' object has no attribute 'append'
при всём этом аналогичная запись работает в Jupyter:
list = [1,2,{"key": 15}]
list[2]['key'].append(6)
import os
import tempfile
import sys
import argparse
import json

parser = argparse.ArgumentParser("Key-Value хранилище.")
parser.add_argument("key_name", type=str, help="Ввод имя ключа")
parser.add_argument('-v',"--val", type=str, help="Ввод значения ключа")
args = parser.parse_args()
storage_path = os.path.join(tempfile.gettempdir(), 'storage.data')

def file_write(key, val):
    try:
        data = json.load(open(storage_path))
    except:
        data = []
    print(type(data))
    if len(data) != 0:
        for i in range(len(data)):
            if key in data[i]:
                data[i][key].append(val)
    else:
        add_dict = {key:val}
        data.append(add_dict)
    with open(storage_path, "w") as f:
        json.dump(data, f, indent=2, ensure_ascii=False)

def file_read(key):
    with open(storage_path, "r"):
        data = json.load(open(storage_path))
        for i in range(len(data)):
            if key in data[i]:
                print(data[i][key])

if args.val != None:
    file_write(args.key_name, args.val)
else:
    file_read(args.key_name)
  • Вопрос задан
  • 318 просмотров
Решения вопроса 1
@o5a
Судя по постановке задачи в хранилище должен быть единственный словарь, а не список. А вот значения словаря уже списком, в которые и будут добавляться новые. Примерно так:
def file_write(key, val):
    try:
        data = json.load(open(storage_path))
    except:
        data = {}

    if key in data:
        data[key].append(val)
    else:
        data[key] = [val]

    with open(storage_path, "w") as f:
        json.dump(data, f, indent=2, ensure_ascii=False)

def file_read(key):
    with open(storage_path, "r"):
        data = json.load(open(storage_path))
        print(data.get(key, 'Пусто'))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@galaxy
Какой-то мутный механизм хранения.
Исходя из постановки, в файле должен быть один словарь:
{
  key1: [val1_1],
  key2: [val2_1, val2_2, val2_3...]
  key3: []
  ...
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы