追加字典,保存到文件并定期增加字典

时间:2012-09-15 23:25:34

标签: python

我创建一个字典并使用json将其保存到文件中。代码会定期输入并更新字典,但不幸的是我无法正确地编写字典。 以下是我写的代码。看看这里:

import os, sys, pickle, re, json
from optparse import OptionParser

parser = OptionParser("Store Daily Intakes \n python [Options] <-h help>")
parser.add_option("-n", "--ndays", dest="ndays", action="store", type="int", help="Input the day")
parser.add_option("-m", "--morning", dest="morning", action="store", type="string", help="Input the morning intake format <Banana-1pc,Bread-1pc,CottageChees-2tbs>")
parser.add_option("-l", "--lunch", dest="lunch", action="store", type="string", help="Input the Lunch intake format <Rice-2tbs,Roti-1pc,ChickenCurry-2tbs,Dal-2tbs>")
parser.add_option("-a", "--afternoon", dest="afternoon", action="store", type="string", help="Input the afternoon intake format <Cornflakes-2tbs,Banana-1pc>")
parser.add_option("-d", "--dinner", dest="dinner", action="store", type="string", help="Input the dinner intake format <Pasta-20gms, Cheese-2slice>")

(options, args) = parser.parse_args()

if options.ndays is None or options.morning is None or options.lunch is None or options.afternoon is None or options.dinner is None :
   print parser.print_help()
   exit(-1)


if os.path.isfile("./DailyInTakeFile.json") is True :

    jout = file('./DailyInTakeFile.json','r') # read mode
    CurDct = json.load(jout)
    print CurDct

    DailyInTake = dict()
    DailyInTake["%d" % options.ndays] = {}
    din = DailyInTake["%s" % options.ndays]
    din['Morning'] = options.morning
    din['Lunch'] = options.lunch
    din['Afternoon'] = options.afternoon
    din['Dinner'] = options.dinner

    saved = sys.stdout
    ofile = file('DailyInTakeFile.json', 'a') # append mode

    for idx in CurDct.keys() :
        if int(idx) == options.ndays :
            print idx, options.ndays
            print "The Intake for day # %d exists" %options.ndays
            print "Are you sure you want to overwrite: Type [yes/no]"
            lett=sys.stdin.read()
            if "yes" in lett :
                CurDct[idx]['Morning'] = options.morning
                CurDct[idx]['Lunch'] = options.lunch
                CurDct[idx]['Afternoon'] = options.afternoon
                CurDct[idx]['Dinner'] = options.dinner
                ofile.close()
                sys.exit("Exiting after updating day # %d" % options.ndays)
            else :
                ofile.close()
                sys.exit("Exiting without update")

        else :
            sys.stdout = ofile
            print json.dumps(DailyInTake)
            print ","
            sys.stdout = saved
            ofile.close()

else :
    DailyInTake = dict()
    DailyInTake["%d" % options.ndays] = {}
    din = DailyInTake["%s" % options.ndays]
    din['Morning'] = options.morning
    din['Lunch'] = options.lunch
    din['Afternoon'] = options.afternoon
    din['Dinner'] = options.dinner

   #print DailyInTake

    saved = sys.stdout
    ofile = file('DailyInTakeFile.json', 'a') # append mode
    sys.stdout = ofile
    print json.dumps(DailyInTake)
    print ","
    sys.stdout = saved
    ofile.close()


from datetime import date, timedelta
from subprocess import call
call("cp DailyInTakeFile.json DailyInTakeFile.json.%s" % str(date.today()), shell=True)

此代码中的输出json文件如下所示:

{"1": {"Lunch": "l3", "Dinner": "d3", "Afternoon": "a3", "Morning": "m3"}}
{"2": {"Lunch": "l3", "Dinner": "d3", "Afternoon": "a3", "Morning": "m3"}}

正如您所看到的那样,每次只添加一个字典而不是附加到创建的第一个字典。我再也不能想出来了。任何帮助将不胜感激。


更新主要变更的代码


 saved = sys.stdout
    for idx in CurDct.keys() :
        if int(idx) == options.ndays :
            print idx, options.ndays
            print "The Intake for day # %d exists" %options.ndays
            print "Are you sure you want to overwrite: Type [yes/no]"
            lett=sys.stdin.read()
            if "yes" in lett :
                ofile = file('DailyInTakeFile.json', 'w') # write mode
                sys.stdout = ofile
                CurDct.update(DailyInTake)
                print json.dumps(CurDct)
                sys.stdout = saved
                ofile.close()
                sys.exit("Exiting after updating day # %d" % options.ndays)
            else :
                sys.exit("Exiting without update")

        else :
            ofile = file('DailyInTakeFile.json', 'w') # write mode
            sys.stdout = ofile
            CurDct.update(DailyInTake)
            print json.dumps(CurDct)
            sys.stdout = saved
            ofile.close()

2 个答案:

答案 0 :(得分:2)

使用JSON序列化作为可变数据存储后端似乎是一个相当奇怪的解决方案。在没有详细查看您的代码的情况下,我建议使用其中一种意味着的解决方案。对于这种情况,最合适的一个似乎是shelve模块。

答案 1 :(得分:2)

根据代码,您每次都会创建一个新词典。并且不要附加到文件中的旧文件。 DailyInTake = dict()因此输出到文件,只需附加一个新词典。

我的建议是。 要将新字典索引添加到CurDct为CurDct[index] = DailyInTake[index],请将整个字典转储回文件。除了追加之外,您可以打开文件进行书写。