我有一个简单的程序,它从用户那里获取输入并将它们放入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的新手。
答案 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
,它就会记住您添加的所有密钥。