在Json中存储字典的数据
我有一个简单的程序,它接受用户的输入并将它们放入字典中。再之后,我想存储的数据为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的新手。
如果您想要使用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])
另一种方法是使用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})
与您的代码,现在,你没有理由要追加到文件。您将整个字典转换为JSON并将其全部写入文件,因此,如果丢失了以前的数据,则无关紧要。 a
在这里没有比w
更有效率。事实上,它更糟糕,因为该文件将占用更多的磁盘空间。
使用CSV模块作为Schmouk说是一个好方法,只要你的数据结构简单。在这种情况下,您只需要一个包含两列和多行的表格,因此CSV是合适的,而且效率更高。
如果每行都有更复杂的结构,比如嵌套的字典和/或列表,或者每行有不同的字段,那么JSON将会更有用。您仍然可以一次追加一行。只需将每行写入一行,并让每行都是整个JSON对象。一次读取一行文件在Python中是正常和简单的。
顺便说一句,没有必要为最后两行。您只需要在程序启动时读取JSON(正如Moses向您显示的那样),以便您可以访问之前运行的数据。之后,您可以使用变量mydict
,它会记住您添加到其中的所有密钥。
*您应该*要覆盖该文件,因为JSON文件格式不允许追加。 –
@SteveJessop所以我只需要使用'w'模式 – GLHF
只要写'如果用户在mydict:' –