2015-01-17 5 views
0

Я новичок в python и mongodb. Я толкая данные из нескольких файлов CSV в MongoDB базу данных, где новые данные должны заменить существующие данные в mongodb.I думаю, что это будет полезно, в то время как увидеть программу, мой код:'Keyerror' при обновлении 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' 

Даже если «Volume» присутствует в моей CSV-файл он бросает KeyError для Volume.Assist мне решить эту проблему

ответ

0

После итерации, field является то, что итерация в прошлом, я думаю, что вы хочу, чтобы это было "Instrument Name", так меняется:

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

To:

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}) 

To:

db.test.find_and_modify(query=k,sort=1,update=row) 
Смежные вопросы