2016-05-16 324 views
0

我有一个简单的程序,它接受用户的输入并将它们放入字典中。再之后,我想存储的数据为JSON文件(我搜索,发现只有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) 

每次用户输入键和值,我想将它们添加到字典,然后将该字典存储在json文件中。每次我想要读取该json文件时,都可以在程序中刷新该字典。

上面那些代码提出ValueError: Extra data:。我知道错误发生,因为我每次都添加字典到json文件,所以有多个字典。但是,我怎样才能一次添加整个字典呢?我不想使用w模式,因为我不想覆盖该文件,而我是Json中的新成员。

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

+1

*您应该*要覆盖该文件,因为JSON文件格式不允许追加。 –

+0

@SteveJessop所以我只需要使用'w'模式 – GLHF

+0

只要写'如果用户在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

与您的代码,现在,你没有理由要追加到文件。您将整个字典转换为JSON并将其全部写入文件,因此,如果丢失了以前的数据,则无关紧要。 a在这里没有比w更有效率。事实上,它更糟糕,因为该文件将占用更多的磁盘空间。

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

如果每行都有更复杂的结构,比如嵌套的字典和/或列表,或者每行有不同的字段,那么JSON将会更有用。您仍然可以一次追加一行。只需将每行写入一行,并让每行都是整个JSON对象。一次读取一行文件在Python中是正常和简单的。

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