Python и добавление в файл JSON

У меня есть окно с вкладками, в котором я прошу пользователей ввести некоторые данные, а затем нажать кнопку, которая обновляет представление списка и добавляет новые данные в конец файла JSON, но я не могу понять, как добавить данные в квадратных скобках [], чтобы сделать его действительным JSON, поэтому я хочу:

[
    {
        "store": "My Store",
        "address": "123 Anywhere Calgary, Ab",
        "category": "Grocery",
        "item": "Ground Coffee",
        "qty": "1",
        "price": "10.99",
        "GST": false,
        "PST": false,
        "EHC": "0.",
        "deposit": "0.",
        "other": "0."
    },
    {
        "store": "My Store",
        "address": "123 Anywhere Calgary, Ab",
        "category": "Grocery",
        "item": "Flour, All Purp",
        "qty": "1",
        "price": "9.99",
        "GST": false,
        "PST": false,
        "EHC": "0.",
        "deposit": "0.",
        "other": "0."
    },
    {   
        "store": "My Store",
        "address": "123 Anywhere Calgary, Ab",
        "category": "Grocery",
        "item": "Taco Shells",
        "qty": "1",
        "price": "4.59",
        "GST": false,
        "PST": false,
        "EHC": "0.",
        "deposit": "0.",
        "other": "0."
    },
    {
        "store": "My Store",
        "address": "123 Anywhere Calgary, Ab",
        "category": "Grocery",
        "item": "BBQ Sauce",
        "qty": "1",
        "price": "3.79",
        "GST": false,
        "PST": false,
        "EHC": "0.",
        "deposit": "0.",
        "other": "0."
    },
    {
        "store": "My Store",
        "address": "123 Anywhere Calgary, Ab",
        "category": "Grocery",
        "item": "Ritz Bits",
        "qty": "1",
        "price": "3.49",
        "GST": false,
        "PST": false,
        "EHC": "0.",
        "deposit": "0.",
        "other": "0."
    }
]

Это подтверждается как правильный формат JSON, но при добавлении в файл я получаю следующее:

[
    {
        "store": "My Store",
        "address": "123 Anywhere Calgary, Ab",
        "category": "Grocery",
        "item": "Ground Coffee",
        "qty": "1",
        "price": "10.99",
        "GST": false,
        "PST": false,
        "EHC": "0.",
        "deposit": "0.",
        "other": "0."
    }
]
[
    {
        "store": "My Store",
        "address": "123 Anywhere Calgary, Ab",
        "category": "Grocery",
        "item": "Flour, All Purp",
        "qty": "1",
        "price": "9.99",
        "GST": false,
        "PST": false,
        "EHC": "0.",
        "deposit": "0.",
        "other": "0."
    }
]

Поскольку каждый добавленный элемент заключен в квадратные скобки [], он больше не является допустимым JSON. Итак, как я могу добавить элементы между [и], чтобы JSON оставался действительным? Есть ли способ добавить элементы, затем перейти к началу файла и вставить [, затем перейти в конец файла и добавить]?

Проблема в том, что пользователь может добавлять продукты в файл JSON в любое время, когда они хотят, поскольку я технически использую JSON в качестве «базы данных». Когда пользователь запускает программу, я хочу иметь возможность перечитать данные JSON и заполнить элемент управления списком предыдущими записями.

Или мне стоит поискать другой метод хранения данных?

Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
127
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
with open("my_file.json","rb") as f:
    existing = json.load(f)
existing.append(item)
with open("my_file.json","wb") as f:
    json.dump(existing,f)

или еще лучше абстрагироваться

class JSONList(object):
     def __init__(self,fname):
        self.fname = fname
        self.items = []
        self.load()


     def save():
        with open(self.fname,"wb") as f:
            json.dump(self.items,f)

     def load(self):
        try:
            self.items = json.load(open(self.fname,"rb"))
        except: # bad form empty except... but whatever
            self.items = []

     def append(self,new_item,save=True):
        self.items.append(new_item)
        if save:
           self.save()

Еще лучше, включите промежуточный шаг для резервного копирования текущей версии файла и восстановления ее в случае сбоя операции записи. Кроме того, вы можете сделать это, унаследовав list вместо object, что даст вам более полезные методы сбора в дополнение к отсутствию необходимости отслеживать сами элементы (просто используйте super().append(...)).

kungphu 02.10.2018 05:25

конечно, много правды во всем этом ... наследование от встроенных функций, таких как list и str, иногда может быть шатким ... поэтому я пытался сохранить его как минимум минимальным

Joran Beasley 02.10.2018 06:23

Другие вопросы по теме