0

辞書を作成し、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"}}

ご覧のとおり、最初に作成された辞書に追加するのではなく、毎回 1 つの辞書を追加するだけです。私はもうそれを考えることができません。どんな助けでも大歓迎です。


主に変更されたコードで更新


 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()
4

2 に答える 2

2

コードによると、毎回新しい辞書を作成します。また、ファイル内の古いものに追加しないでください。DailyInTake = dict()したがって、ファイルに出力し、新しい辞書を追加するだけです。

私の提案はそうでしょう。新しいディクショナリインデックスをとしてCurDctに追加するには、CurDct[index] = DailyInTake[index]ディクショナリ全体をファイルにダンプします。追加以外の書き込み用にファイルを開くことができます。

于 2012-09-15T23:34:06.377 に答える
2

JSON シリアライゼーションを変更可能なデータ ストレージ バックエンドとして使用することは、かなり奇妙なソリューションのように思えます。コードを詳しく見ずに、この方法で使用することを意図したソリューションの 1 つを使用することをお勧めします。この場合に最も適しているのはshelveモジュールのようです。

于 2012-09-15T23:28:30.490 に答える