제대로 csvDictReader 개체를 반복하는 방법을 이해하는 데 어려움을 겪고 있습니다. 특정 사용자 정의 데이터 코드에 연결된 각 csv 값을 반환하려고합니다. 웹 쿼리에서 사전을 생성하기 때문에 이미 메모리에있는 데이터를 다시 폴링하지 않고 메모리에서 다시 사용하고자합니다.중첩 된 for 루프로 csvDictReader 반복
import sys, csv, urllib2
class SmfImpl():
def __init__(self, ctx):
self.ctx = ctx
self.csv_dict = []
self.flag = ['Not Available', '']
self.ticker = 'XOM'
def getMorningKey(self, datacode):
return fetch_keyratios(self, datacode)
#these functions are not in the SmfImpl class because they're from a seperate file
def query_morningstar(self, url_ending):
url = 'http://financials.morningstar.com/ajax/exportKR2CSV.html?&callback=?&t=XNYS:%s%s' % (self.ticker, url_ending)
req = urllib2.Request(url)
response = sniff_query(req)
response.readline()
return csv.DictReader(response)
def sniff_query(req):
try:
response = urllib2.urlopen(req)
except urllib2.URLError:
return 'Check Connection'
sniff = response.readline()
if str(sniff) == '':
return 'Not Available'
return response
def fetch_keyratios(self, datacode):
if datacode < 1 or datacode > 990:
return 'Invalid Datacode'
#check if we already have the data we need
if self.flag[0] == 'Check Connection' or self.flag[0] == 'Not Available' or self.flag[1] != self.ticker:
#query remote and check for errors
self.csv_dict = query_morningstar(self,'®ion=usa&culture=en-US&cur=USD&order=desc')
if self.csv_dict == 'Check Connection' or self.csv_dict == 'Not Available':
self.flag[1] = ''
return self.csv_dict
else:
self.flag[0] = ''
self.flag[1] = self.ticker
return sort_keyratios(self, datacode)
def sort_keyratios(self, datacode):
counter = 1
skipped = 0
skip_lines = [15, 16, 26, 36, 37, 57, 58, 64, 65, 86, 91, 92]
#iterate through returned dict line by line
for line in self.csv_dict:
for item in skip_lines:
if counter == item:
skipped += 1
for val in range(1, len(line)):
#match year values to datacodes
if datacode == val:
return self.csv_dict.fieldnames[val]
#match data values to datacodes
if datacode-((counter-skipped)*(len(line)-1)) == val:
return line[self.csv_dict.fieldnames[val]]
counter += 1
return 'No Data'
if __name__ == "__main__":
smf = SmfImpl(sys.argv)
ticker = 'XOM'
for val in range (1,24):
print ticker, val,':', smf.getMorningKey(val)
원래 CSV는 스크립트에 의해 호출됩니다, 그러나 또한
here을 찾을 수 있습니다내가 갖는 출력은 : 나는 얻기 위해 노력하고 무엇
XOM 1 : TTM
XOM 2 : 2012-12
XOM 3 : 2011-12
XOM 4 : 2010-12
XOM 5 : 2009-12
XOM 6 : 2008-12
XOM 7 : 2007-12
XOM 8 : 2006-12
XOM 9 : 2005-12
XOM 10 : 2004-12
XOM 11 : 2003-12
XOM 12 : -35,300
XOM 13 : 21,899
XOM 14 : 5.00
XOM 15 : -3,649
XOM 16 : None
XOM 17 : 2008-12
XOM 18 : 100.00
XOM 19 : 56.47
XOM 20 : 42.54
XOM 21 : 4.65
XOM 22 :
XOM 23 : 13.67
:
XOM 1 : TTM
XOM 2 : 2012-12
XOM 3 : 2011-12
XOM 4 : 2010-12
XOM 5 : 2009-12
XOM 6 : 2008-12
XOM 7 : 2007-12
XOM 8 : 2006-12
XOM 9 : 2005-12
XOM 10 : 2004-12
XOM 11 : 2003-12
XOM 12 : 443,708
XOM 13 : 482,295
XOM 14 : 486,429
XOM 15 : 383,221
XOM 16 : 310,586
XOM 17 : 477,359
XOM 18 : 404,552
XOM 19 : 377,635
XOM 20 : 370,680
XOM 21 : 298,035
XOM 22 : 246,738
XOM 23 : 27.8
EDIT : 원본 csv의 줄당 그룹으로 데이터 코드를 매핑하려고합니다. 예 : Years는 1에서 11까지의 데이터 코드 (TTM에서 2003-12), Revenue는 12에서 22 (443708에서 246738)까지의 데이터 코드입니다. 궁극적으로 이러한 데이터 코드는 사용자 입력으로 이동되므로 어떤 순서로든 액세스 할 수 있습니다.
vals/datacode가 항상 오름차순으로 액세스됩니까? csv 전체를 메모리로 읽어 들일 수 있습니까? – martineau
아니요, main에 정의 된 ticker와 val은 궁극적으로 사용자 입력/sys.argv로 이동되므로 임의의 순서로 값에 액세스 할 수 있습니다. – dman
글쎄, 한 가지는,'csv.DictReader'가 순차적 인 매너의 데이터에 접근하기 때문에 매번 csv 데이터의 적어도 일부분을 다시 읽는 것을 의미 할 것입니다. 그래서 나는 모든 것을 메모리로 읽어 들일 것을 제안했습니다. 랜덤 억세스를 허용 할 것이다. 또한 귀하의 질문에 추가 정보가 추가되어야합니다. 왜냐하면 코드와 코드에서 주석이 충분히 명확하지 않기 때문에 csv 파일의 위치에 대한 데이터 코드 매핑을 설명하는 추가 정보가 필요합니다. 솔직히 말해서 왜 당신이'csv.DictReader'를 사용하여 이것을하고 있는지 분명하지 않습니다. – martineau