1

と呼ばれる(郡、州、年)タプルのcsvファイルがありますctyear.csv。タプルごとに、年、郡、州ごとのファスト フード店と食料品店 (num_ffおよび) の数が必要です。num_grocこの情報は、次の形式で年ごとに名前が付けられた国勢調査データ ファイルに保存されます (したがってcbp96co.csv'、1996 年のデータを指します)。

state, year, county, industry_code, number_of_establishments
'1', '1996', '55030', '30', '20'
'1', '1996', '55404', '31', '13' 
'14', '1996' , '23', '5411', '24'

ファースト フードと食料品の業界コード (私が情報を取得したいと考えている業界) は、年ごとに異なります。ヘルパー関数whichcode()(以下のコードには含まれていません) は、特定の年に関連する業界コードを返します。

次の関数は、開いているファイル ハンドルrawffrawgrocfferrors、およびgrocerrorsを指定すると、(郡、州、年) タプルごとに (その年の適切な業界コードで指定された) 食料品店とファーストフード店の数を検索し、にctyear書き込みます。上記の CSV ファイル ハンドル。

この関数は正しい結果を出力します。この意味で、それは機能します。適切なデータを抽出します。しかし、それは終わりません。呼び出すと、最後の行を印刷した後でも関数は終了しません。Terminal でこの関数を 1 年以上呼び出すと、関数の最後の行を出力した後、Terminal は次の数時間だけ点滅するカーソルを表示します - 停止していないようです。何がうまくいかないのですか?

def extractCBPdata(year, rawff, rawgroc, fferrors, grocerrors): 
   # Initialize file name, get the set of codes we're interested in extracting for this year using whichcode()
    fname = "cbp"+str(year)+"co.txt"
    info = whichcode(year)
    codename = info['codename']
    groccode = info['groccode']
    ffcode = info['ffcode']
    cbpind = {} 
   # Index data file by (state, county, year, code)
    for line in csv.DictReader(open(fname, 'rb')): 
        cbpind[(int(line['fipstate']), int(line['fipscty']), getyear(year), line[codename])] = line
   # Read a list of tuples of (state, county, year) that we want information about
    ctyear = csv.DictReader(open('ctyear.csv', 'r')) 
   # For every (state, county, year) tuple in the above file, get info from the cbpind for relevant codes
    for c in ctyear:  
        if c['year'] == getyear(year): 
            fipstate = int(c['fipstate']) 
            fipscty = int(c['fipscty']) 
            for fc in ffcode: 
               if (fipstate, fipscty, getyear(year), fc) in cbpind: 
                      line1 = cbpind[(fipstate, fipscty, getyear(year), fc)] 
                      st = line1['fipstate'] 
                      cty = line1['fipscty']
                      num_ff = line1['est'] 
                      row_titles = ['fipstate', 'fipscty', 'codename', 'code', 'year', 'num_ff']
                      row = [st, cty, codename, fc, getyear(year), num_ff] 
                      rawff.writerow(dict(zip(row_titles, row)))
               else: 
                      fferrors.writerow(dict(zip(['fipstate', 'fipscty', 'year', 'ffcode'], [fipstate, fipscty, getyear(year), fc])))
            for gc in groccode:         
                if (fipstate, fipscty, getyear(year), gc) in cbpind: 
                      line2 = cbpind[(fipstate, fipscty, getyear(year), gc)]
                      st = line2['fipstate'] 
                      cty = line2['fipscty'] 
                      num_groc = line2['est']
                      row_titles = ['fipstate', 'fipscty', 'codename', 'code', 'year', 'num_groc']
                      row = [st, cty, codename, fc, year, num_groc]
                      rawgroc.writerow(dict(zip(row_titles, row)))
               else: 
                      grocerrors.writerow(dict(zip(['fipstate', 'fipscty', 'year', 'grocode'], [fipstate, fipscty, year, gc])))
    print "Done writing for " + str(year)
    return

次の行を使用してこの関数を実装します。

g = ['num_groc', 'fipstate', 'fipscty', 'codename', 'code', 'year']
ff = ['num_ff', 'fipstate', 'fipscty', 'codename', 'code', 'year']
rawff = csv.DictWriter(open('raw_ff' + str(year) + '.csv', 'w'), fieldnames = ff)
rawgroc = csv.DictWriter(open('raw_groc' + str(year) + '.csv', 'w'), fieldnames = g) 
fferrors = csv.DictWriter(open('fferrors' + str(year) + '.csv', 'w'), fieldnames = ['fipstate', 'fipscty', 'year', 'ffcode'])
grocerrors = csv.DictWriter(open('grocerrors' + str(year) + '.csv', 'w'), fieldnames = ['fipstate', 'fipscty', 'year', 'grocode'])
grocerrors.writerow(dict(zip(['fipstate', 'fipscty', 'year', 'grocode'], ['fipstate', 'fipscty', 'year', 'grocode'])))
rawff.writerow(dict(zip(ff,ff)))
rawgroc.writerow(dict(zip(g,g)))
fferrors.writerow(dict(zip(['fipstate', 'fipscty', 'year', 'ffcode'],['fipstate', 'fipscty', 'year', 'ffcode'])))

years = ['96', '97', '98', '99', '00', '01', '02', '03', '04', '05']
for y in years: 
    l = extractCBPdata(y)           
4

0 に答える 0