' KeyError异常'同时更新mongodb

时间:2015-01-17 11:43:15

标签: python mongodb csv

我是python和mongodb的初学者。我将数据从多个csv文件推送到mongodb数据库,其中新数据应该替换mongodb中的现有数据。我认为在查看程序时它会有所帮助, 我的代码:

from pymongo import MongoClient
import csv
path = 'C://test//xxx.csv'   

csvfile = open(path, "r")
reader = csv.DictReader( csvfile )
mongo_client=MongoClient() 
db=mongo_client.production
header= ["Instrument Name", "Date", "High", "Low", "Open", "Close", "Prev Close", "Volume"]
for each in reader:
    row={}
    k={}
    for field in header:
        if field=="Instrument Name":
            row[field]=each[field]
            k[field]=row[field]
            print k[field]
        elif field=="Date":
            row[field]=datetime.datetime.strptime(each[field], "%Y-%m-%d %H:%M:%S" )                    
        else:
            row[field]=float(each[field])
                    #row[field]=each[field]
    print row
    db.test.find_and_modify(query={'Instrument Name':k[field]},sort=1,update={row})
csvfile.close()

输出:

BANKNIFTY15MARFUT
{'Volume': 200.0, 'Prev Close': 18919.8, 'Instrument Name': 'BANKNIFTY15MARFUT', 'High': 19350.2, 'Low': 19350.2, 'Date': datetime.datetime(2015, 1, 13, 9, 15), 'Close': 19350.2, 'Open': 19350.2}
KeyError                                  Traceback (most recent call last)
<ipython-input-1-0f0bc16df1c5> in <module>()
    263             print row
    264                 #row[field]=each[field]
--> 265             db.test.find_and_modify(query={"Instrument Name":k[field]},sort=1,update={row})
    266         csvfile.close()
    267 

KeyError: 'Volume'

尽管&#39;卷&#39;在我的csv中出现它会引发Keyerror for Volume。请我解决这个问题

1 个答案:

答案 0 :(得分:0)

迭代后,field是最后迭代的,我认为你希望它是"Instrument Name",所以改变:

db.test.find_and_modify(query={'Instrument Name':k[field]},sort=1,update={row})

要:

db.test.find_and_modify(query={'Instrument Name':k["Instrument Name"]},sort=1,update={row})

甚至更好,因为k只有"Instrument Name"

db.test.find_and_modify(query=k,sort=1,update={row})

此外,row已经是字典,可能是update所期望的字典,所以替换:

db.test.find_and_modify(query={"Instrument Name":k[field]},sort=1,update={row})

要:

db.test.find_and_modify(query=k,sort=1,update=row)