2016-04-10 2 views
0
def getQuotesYahoo(): 

    tickerStr = "GOOGL+AMZN" 
    yahoo_url ="http://finance.yahoo.com/d/quotes.csv?s=%s&f=saohgb3t1" % (tickerStr) 
    retQuotes = {} 

    data = urllib2.urlopen(yahoo_url).readlines() 

    for d in data: 
     p = d.strip().split(',') 
     stkInfo = {} 
     stkInfo['lastTime'] = p[6] 
     stkInfo['last'] = p[1] 
     stkInfo['open'] = p[2] 
     stkInfo['high'] = p[3] 
     stkInfo['low'] = p[4] 
     stkInfo['bid'] = p[5] 
     tic = p[0] 
     print stkInfo 
     retQuotes[tic] = stkInfo 

    print retQuotes['GOOGL']['last'] 

Этот код не работает в KeyError и не заполняет словарь строковым ключом. У меня есть тот же самый код, который работает для googlefiance.Python Ошибка с KeyError

KeyError: 'GOOGL'

retQuotes:

{'"AMZN"': {'last': '594.60', 'bid': 'N/A', 'high': '597.86', 'low': '589.00', 'lastTime': '"4:00pm"', 'open': '594.32'}, '"GOOGL"': {'last': '759.98', 'bid': 'N/A', 'high': '767.13', 'low': '755.77', 'lastTime': '"4:00pm"', 'open': '765.87'}}

+3

биржевой код для google не является 'GOOGL', это' GOOG' – n1c9

+1

Что входит в 'retQuotes'? Печать переменной может быть полезна. –

+0

выглядит как тикер в структуре. – user3763220

ответ

0

кажется, что ключ присутствует в диктофоне «GOOGL», поэтому в ключе есть двойные кавычки. (Вся строка на самом деле «GOOGL»), так что вам нужно будет обращаться к нему как:

retQuotes['"GOOGL"']['last'] 

Хотя это выглядит (за исключением N/A) все данные из запаса будут действительные литералами питона, который означает, что вы можете использовать ast.literal_eval для анализа данных в виде кортежа:

d = d.replace("N/A","None") 
fields = ast.literal_eval("(%s)"%d) #add round brackets to indicate the data is a tuple 

вы можете также сократить декларацию с помощью zip с dict конструктору:

import ast 
field_names = ('last','open','high','low','bid','lastTime') 
for d in data: 
    d = d.replace("N/A","None") 
    fields = ast.literal_eval("(%s)"%d) #add round brackets to indicate the data is a tuple 
    stock = fields[0] 
    stkInfo = dict(zip(field_names,fields[1:])) 
    retQuotes[stock] = stkInfo 
+0

Я бы думаю, что это будет намного быстрее. Спасибо за помощь – user3763220

+0

@ user3763220 Пожалуйста, знайте, что есть механизм для [принятия ответа] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). –

+0

спасибо, ребята. очень полезно. – user3763220