【问题标题】:Python 2.7 Dict is overwriting itselfPython 2.7 Dict 正在覆盖自身
【发布时间】:2018-08-13 13:27:15
【问题描述】:

嘿,伙计们,我的 dict phistory 每次调用这个函数时都会自己覆盖它,我希望它会向 dict 添加一个新条目。

def pHistory(): #Creates/loads a Dict of historical prices then saves it after the update phase 2
    global phistory
    global dataentries
    phistory = {}
    dataentries = 0
    print phistory
    print dataentries

    def loaddata(): 
        global dataentriesa
        with open('StockDb.FUMatt','r') as y:
            vhistory = y.read()
            print vhistory
            phistory = vhistory
            print phistory
        with open('count.FUMatt','r') as ya:
            strdataa = ya.read()
            print strdataa
            dataentriesa = int(strdataa)
            print dataentriesa

    def save(): #function to save database to file
        with open('StockDb.FUMatt','w') as z:
            savith = json.dumps(phistory)
            z.write(savith)
            print savith
        with open('count.FUMatt','w') as j:
            strdata = str(dataentries)
            j.write(strdata)
            print strdata

    loaddata()
    dataentries = dataentriesa
    a = stockdf.keys()
    print dataentries
    print phistory
    for b in a:
        name = stockdf[b]['name']
        price = stockdf[b]['price']
        time = stockdf[b]['time']
        historyupdate = { b: {dataentries: {time:price}}}
        phistory.update(historyupdate)
    c = phistory.keys()
    #print c
    dataentries = dataentries + 1
    save()

当此代码运行时,日志条目的计数工作正常,但是当数据条目 2 添加到字典时,数据条目 1 中的所有信息都会被覆盖。我忽略了什么吗?

json格式是

{
"EVL": {
    "35": {
        "2018-08-13 14:00:01": "440.716"
    }
},
"TCHS": {
    "35": {
        "2018-08-13 14:00:01": "994.678"
    }
},
"FHG": {
    "35": {
        "2018-08-13 14:00:01": "404.863"
    }
},
"WLT": {
    "35": {
        "2018-08-13 14:00:01": "988.793"
    }
},
"BAG": {
    "35": {
        "2018-08-13 14:00:01": "2346.422"
    }
},
"MSG": {
    "35": {
        "2018-08-13 14:00:01": "305.658"
    }
},
"TMI": {
    "35": {
        "2018-08-13 14:00:01": "1021.110"
    }
},
"TGP": {
    "35": {
        "2018-08-13 14:00:01": "195.230"
    }
},
"IOU": {
    "35": {
        "2018-08-13 14:00:01": "535.950"
    }
},
"LSC": {
    "35": {
        "2018-08-13 14:00:01": "989.317"
    }
},
"TSBC": {
    "35": {
        "2018-08-13 14:00:01": "496.127"
    }
},
"PRN": {
    "35": {
        "2018-08-13 14:00:01": "851.644"
    }
},
"TCP": {
    "35": {
        "2018-08-13 14:00:01": "242.966"
    }
},
"TCM": {
    "35": {
        "2018-08-13 14:00:01": "553.274"
    }
},
"WSSB": {
    "35": {
        "2018-08-13 14:00:01": "65.845"
    }
},
"IIL": {
    "35": {
        "2018-08-13 14:00:01": "85.831"
    }
},
"TCB": {
    "35": {
        "2018-08-13 14:00:01": "428.470"
    }
},
"TCC": {
    "35": {
        "2018-08-13 14:00:01": "550.622"
    }
},
"EWM": {
    "35": {
        "2018-08-13 14:00:01": "871.508"
    }
},
"YAZ": {
    "35": {
        "2018-08-13 14:00:01": "51.068"
    }
},
"TCSE": {
    "35": {
        "2018-08-13 14:00:01": "19067.656"
    }
},
"CNC": {
    "35": {
        "2018-08-13 14:00:01": "642.367"
    }
},
"GRN": {
    "35": {
        "2018-08-13 14:00:01": "267.374"
    }
},
"SLAG": {
    "35": {
        "2018-08-13 14:00:01": "234.068"
    }
},
"HRG": {
    "35": {
        "2018-08-13 14:00:01": "426.689"
    }
},
"ISTC": {
    "35": {
        "2018-08-13 14:00:01": "1010.354"
    }
},
"SYM": {
    "35": {
        "2018-08-13 14:00:01": "1184.627"
    }
},
"SYS": {
    "35": {
        "2018-08-13 14:00:01": "660.124"
    }
},
"ELBT": {
    "35": {
        "2018-08-13 14:00:01": "125.758"
    }
},
"MCS": {
    "35": {
        "2018-08-13 14:00:01": "1720.868"
    }
},
"TCT": {
    "35": {
        "2018-08-13 14:00:01": "375.333"
    }
}
} {
"EVL": {
    "36": {
        "2018-08-13 14:15:01": "440.425"
    }
},
"TCHS": {
    "36": {
        "2018-08-13 14:15:01": "994.438"
    }
},
"FHG": {
    "36": {
        "2018-08-13 14:15:01": "404.876"
    }
},
"WLT": {
    "36": {
        "2018-08-13 14:15:01": "988.940"
    }
},
"BAG": {
    "36": {
        "2018-08-13 14:15:01": "2348.502"
    }
},
"TCT": {
    "36": {
        "2018-08-13 14:15:01": "375.416"
    }
},
"MSG": {
    "36": {
        "2018-08-13 14:15:01": "305.709"
    }
},
"TMI": {
    "36": {
        "2018-08-13 14:15:01": "1021.672"
    }
},
"TGP": {
    "36": {
        "2018-08-13 14:15:01": "195.230"
    }
},
"LSC": {
    "36": {
        "2018-08-13 14:15:01": "989.401"
    }
},
"TSBC": {
    "36": {
        "2018-08-13 14:15:01": "496.085"
    }
},
"PRN": {
    "36": {
        "2018-08-13 14:15:01": "851.735"
    }
},
"TCP": {
    "36": {
        "2018-08-13 14:15:01": "242.994"
    }
},
"TCM": {
    "36": {
        "2018-08-13 14:15:01": "552.139"
    }
},
"WSSB": {
    "36": {
        "2018-08-13 14:15:01": "65.845"
    }
},
"IIL": {
    "36": {
        "2018-08-13 14:15:01": "85.833"
    }
},
"TCB": {
    "36": {
        "2018-08-13 14:15:01": "428.538"
    }
},
"TCC": {
    "36": {
        "2018-08-13 14:15:01": "550.983"
    }
},
"EWM": {
    "36": {
        "2018-08-13 14:15:01": "871.608"
    }
},
"YAZ": {
    "36": {
        "2018-08-13 14:15:01": "51.065"
    }
},
"TCSE": {
    "36": {
        "2018-08-13 14:15:01": "19069.714"
    }
},
"CNC": {
    "36": {
        "2018-08-13 14:15:01": "642.603"
    }
},
"GRN": {
    "36": {
        "2018-08-13 14:15:01": "267.333"
    }
},
"SLAG": {
    "36": {
        "2018-08-13 14:15:01": "233.866"
    }
},
"HRG": {
    "36": {
        "2018-08-13 14:15:01": "426.800"
    }
},
"ISTC": {
    "36": {
        "2018-08-13 14:15:01": "1010.045"
    }
},
"SYM": {
    "36": {
        "2018-08-13 14:15:01": "1184.777"
    }
},
"SYS": {
    "36": {
        "2018-08-13 14:15:01": "660.208"
    }
},
"ELBT": {
    "36": {
        "2018-08-13 14:15:01": "125.717"
    }
},
"MCS": {
    "36": {
        "2018-08-13 14:15:01": "1721.041"
    }
},
"IOU": {
    "36": {
        "2018-08-13 14:15:01": "535.890"
    }
}
}

这与您的附加更改有关,肯定会取得进展,但最佳情况下它不会像这样将它们分开,只是将它们分开购买计数

counts 格式实际上只是一个整数,表示在哪里计数,例如现在在哪里

36 但从技术上讲,下一次运行 phistory 计数已经增加到 37,将加载 37 到数据条目中

{
"EVL": {
    "35": {
    "2018-08-13 14:00:01": "440.716"
}
    "36": {
    "2018-08-13 14:00:01": "440.716"
    }
},
"TCHS": {
    "35": {
    "2018-08-13 14:00:01": "994.678"
}
    "36": {
    "2018-08-13 14:00:01": "440.716"
    }
},

这是所需的格式

我想我可以把 b 插入到类似的东西中

b = u'EVL'
import unicodedata
unicodedata.normalize('NFKD', b).encode('ascii','ignore')
'EVL'

【问题讨论】:

    标签: python json python-2.7


    【解决方案1】:

    检查这是否有效

    for b in a:
        name = stockdf[b]['name']
        price = stockdf[b]['price']
        time = stockdf[b]['time']
        if not b in phistory:
            phistory[b] = {}
        phistory[b][dataentries] = {time:price}
    c = phistory.keys()
    #print c
    dataentries = dataentries + 1
    save()
    

    这应该会导致您正在寻找的那种行为。

    请在较小的数据库样本上运行测试,这将使调试变得更快。

    有趣的是,由于我们每次调用函数时都在重写/更新 phistory,因此我们实际上可能希望在这里使用 'w' 而不是 'a'。否则,我们基本上会在一个文件中存储每个 phistory 迭代的历史,这可能会变得很大。我建议进行上述更改,然后分别测试“w”和“a”,因为我认为“w”实际上可能会给你你想要的。


    编辑:回答最后一个问题

    这就是您创建和更新字典的方式。 update() 执行它在 tin 上所说的操作,它更新字典中的 (k,v) 对。它不会附加任何东西,除非它们已经不存在。由于顶级键“EVL”已经存在,当你传入 update({'EVL' : some_values})

    时,它的所有值都会被覆盖

    我这样做的方式是创建一个空条目(如果没有),然后通过基本上告诉它在该新键中放入什么值来更新它。语法

    dict[key] = X
    

    如果该密钥不存在,将更新该密钥或创建一个新密钥,但是

    dict[key][key2] = X
    

    依赖 dict[key] 存在,否则它不会知道 [key2] 的父级是什么来添加它。这就是为什么我们必须显式创建顶级密钥(如果它不存在)。然后之后

    dict[key_that_exists][key2] = X
    

    将更新 (key2, v) 对或在它不存在时创建它。

    希望有帮助:)

    【讨论】:

      猜你喜欢
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 2022-07-31
      • 2018-03-19
      • 2016-02-18
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多