Использование JSON файлов для хранения и извлечения данных списка - PullRequest
3 голосов
/ 17 июня 2020

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

import json
import os.path

income = []

def file_exists():
    if os.path.exists('income.json') == True:
        with open('income.json') as f:
            income = json.load(f)
    else:
        pass

def desire_func():
  x = input('What do you want to do? ')
  if x != 'n':
    transactions()
    print(income)
  else:
    return

def transactions():
    with open('income.json', 'w') as g:
        entry = float(input('Transaction info: '))
        income.append(entry)
        json.dump(income, g)
        desire_func()

file_exists()
transactions()
print(income)

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

Заранее спасибо за вашу помощь.

EDIT: добавлено в desire_fun c (), чтобы вы могли легко добавлять несколько раз в один и тот же список (доход) при устранении неполадок.

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

похоже, вместо добавления, вы хотите установить загруженный JSON в доход, чтобы предотвратить вложение массива все глубже и глубже с каждой итерацией.

def file_exists():
if os.path.exists('income.json') == True:
    with open('income.json') as f:
        income (json.load(f))
else:
    pass

должно стать

def file_exists():
if os.path.exists('income.json') == True:
    with open('income.json') as f:
        income = json.load(f)
else:
    pass

Форм-фактор списка переменной дохода должен быть сохранен в файле JSON.

Пример:

>>> testlist = ['test', 'test2']
>>> import json
>>> with open('income.json', 'w') as g:
...     json.dump(testlist, g)
...

выход и перезапуск

>>> import json
>>> with open('income.json') as f:
...     testlist = json.load(f)
... 
>>> testlist
['test', 'test2']

edit: Итак, одна вещь, которая могла быть проблемой, касается области видимости переменных. Обычно функции принимают параметры. это гарантирует, что ясно, какое значение будет принимать функциональная переменная в случаях, когда вы используете то же имя переменной в других местах кода. В текущем коде, если вы распечатаете переменную дохода в функции транзакций, вы увидите, что это пустой список.

вы можете исправить это, передав список своим функциям:

import json
import os.path

def file_exists():
    if os.path.exists('income.json') == True:
        with open('income.json') as f:
            income = json.load(f)
            print(income)
            return income
    else:
        return []

def transactions(income):
    print(income)
    with open('income.json', 'w') as g:
        entry = float(input('Transaction info: '))
        print(entry)
        income.append(entry)
        print(income)
        json.dump(income, g)

income = file_exists()
transactions(income)
print(income)
2 голосов
/ 17 июня 2020

Использовать режим добавления a вместо режима записи w:

Измените это:

with open('income.json', 'w') as g:

на это:

with open('income.json', 'a') as g:

Изменить:

Список инициализируется каждый раз при завершении программы. Вы можете использовать al oop, чтобы продолжать читать файлы, если вы этого не хотите, например:

income = []

def populate_list():
    income.append(input('Enter something to add to list: '))

def show_list():
    print(income)

while True:
    x = input("Press 1 to exit: ")
    if x is not'1':
        populate_list()
        show_list()
    else:
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...