在Json

时间:2016-05-16 22:31:43

标签: python json dictionary python-3.4

我有一个简单的程序,它从用户那里获取输入并将它们放入dict中。之后我想将这些数据存储到json文件中(我搜索并发现只有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中,之后将该dict存储在json文件中。每次我想读取那个json文件,这样我就可以刷新程序中的字典。

以上代码提出ValueError: Extra data:。我理解错误发生,因为我每次都将dict添加到json文件,因此有多个dict。但是如何立刻添加整个词典呢?我不想使用w模式,因为我不想覆盖该文件,而且我是Json的新手。

程序必须是无限的,我必须每次刷新dict,这就是为什么我找不到任何解决方案或尝试任何东西,因为我是Json的新手。

3 个答案:

答案 0 :(得分:1)

如果你想使用JSon,那么你将不得不使用' w'打开文件进行写入时的选项。 ' a +'选项会在之前保存的版本之后立即将完整的dict附加到文件中。

为什么不使用csv?用' a +'选项,任何新输入的用户信息都将附加到文件的末尾,并在阅读时将其内容转换为dict非常简单,应该类似于:

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]) 

答案 1 :(得分: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})

答案 2 :(得分:0)

使用您现在的代码,您没有理由附加到该文件。您无论如何都要将整个dict转换为JSON并将其全部写入文件,因此如果丢失以前的数据并不重要。 a在这里效率不比w高。实际上情况更糟,因为该文件将在磁盘上占用更多空间。

使用CSV模块作为Schmouk说的是一种很好的方法,只要您的数据结构简单。在这种情况下,您只有一个包含两列和多行的表,因此CSV是合适的,也更有效。

如果每一行都有更复杂的结构,例如嵌套的dicts和/或列,或每行的不同字段,那么JSON将更有用。您仍然可以一次追加一行。只需将每一行写入一行,并使每行成为一个完整的JSON对象。在Python中一次读取一行文件是正常和容易的。

顺便说一句,最后两行不需要。您只需在程序启动时读取JSON(如Moses所示),这样您就可以访问以前运行的数据。之后,您只需使用变量mydict,它就会记住您添加的所有密钥。