2016-05-16 3 views
0

У меня есть простая программа, которая берет входные данные от пользователя и помещает их в dict. После того, как я хочу, чтобы хранить эти данные в JSON файл (я искал и нашел только JSON полезной)Хранение данных dict в Json

, например

mydict = {} 

while True: 
    user = input("Enter key: ") 
    if user in mydict.keys(): #if the key already exist only print 
     print ("{} ---> {}".format(user,mydict[user])) 
     continue 

    mn = input("Enter value: ") 
    app = input ("Apply?: ") 

    if app == "y": 
     mydict[user] = mn 
     with open ("mydict.json","a+") as f: 
      json.dump(mydict,f) 

    with open ("mydict.json") as t: 
     mydict = json.load(t) 

Каждый раз, когда пользователь ввести ключ и значение, я хочу, чтобы добавить их в Словаре, после этого сохраните этот dict в json-файле. И каждый раз, когда я хочу прочитать этот json-файл, я могу обновить dict в программе.

Указанные выше коды ValueError: Extra data:. Я понял, что ошибка произошла, потому что я каждый раз добавляю файл dict в json-файл, чтобы было более одного dict. Но как я могу добавить целый дикт сразу? Я не хотел использовать режим w, потому что я не хочу перезаписывать файл, и я новичок в Json.

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

+1

Вы * должны * хотеть перезаписать файл, потому что формат файла JSON не позволяет добавлять. –

+0

@SteveJessop Так что мне просто нужно использовать режим 'w' – GLHF

+0

Просто напишите' if user in mydict: ' –

ответ

1

Если вы хотите использовать JSon, вам нужно будет использовать параметр «w» при открытии файла для записи. Опция 'a +' добавит ваш полный файл к файлу сразу после его ранее сохраненной версии.

Почему бы вам не использовать csv вместо этого? С «A +» вариант, любой вновь введенные данные пользователя будут добавляться в конец файла и преобразование его содержание во время чтения в Словаре довольно легко и должен выглядеть примерно так:

import csv 
with open('your_dict.json', 'r') as fp: 
    yourDict = {key: value for key,value in csv.reader(fp, delimiter='\t') 

пока спасительной контрагенте будет выглядеть так:

yourDictWriter = csv.writer(open('your_dict.json','a+'), delimiter='\t')) 
#... 
yourDictWriter.writerow([key, value]) 
0

Другим подходом было бы использовать MongoDB, базу данных, предназначенную для хранения json-документов. Тогда вам не придется беспокоиться о перезаписи файлов, кодировке json и т. Д., Так как база данных и драйвер будут управлять этим для вас. (. Кроме того, обратите внимание, что это делает ваш код более кратким) Предполагая, что вы установили и запустили MongoDB, вы могли бы использовать его как это:

import pymongo 
client = MongoClient() 
db = client.test_database.test_collection 

while True: 
    user = input("Enter key: ") 
    if db.find_one({'user': user}) #if the key already exist only print 
     print ("{} ---> {}".format(user, db.find_one({'user':user})['value']) 
     continue 

    mn = input("Enter value: ") 
    app = input ("Apply?: ") 

    if app == "y": 
     db.insert({'user':user, 'value':value}) 
0

С вашего кода, как это прямо сейчас, у вас нет никаких оснований, добавляемых к файл. Вы конвертируете весь dict в JSON и все равно записываете все в файл, поэтому не имеет значения, потеряете ли вы предыдущие данные. a не более эффективен, чем w здесь. На самом деле это хуже, потому что на диске будет гораздо больше места на диске.

Использование CSV-модуля, поскольку Schmouk сказал, является хорошим подходом, если ваши данные имеют простую структуру. В этом случае у вас есть таблица с двумя столбцами и несколькими строками, поэтому CSV подходит, а также более эффективен.

Если каждая строка имеет более сложную структуру, такую ​​как вложенные диктофоны и/или списки, или разные поля для каждой строки, тогда JSON будет более полезен. Вы можете добавить одну строку за раз. Просто напишите каждую строку в одну строку, и каждая строка будет единственным объектом JSON самостоятельно. Чтение файлов по одной строке за один раз является обычным и легким в Python.

Кстати, нет необходимости в последних двух строках. Вам нужно только прочитать в JSON при запуске программы (как показал Моисей), чтобы вы имели доступ к данным предыдущих прогонов. После этого вы можете просто использовать переменную mydict, и она запомнит все ключи, которые вы добавили к ней.

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