2016-04-10 29 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のために働く基本的に同じコードを持っています。KeyErrorでPythonが失敗する

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』」辞書でキー存在があるようです。 、株式からのすべてのデータが有効なPythonのリテラルになり、それは(N/Aを除く)のように見えますが

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

:(文字列全体は、実際に「GOOGL」である)ので、あなたはとしてそれを参照する必要がありますあなたはタプルとしてデータを解析する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 

またdictコンストラクタでzipを使用して宣言を短縮することができます。

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

関連する問題