0

手順を提供するファイルがあり、その手順に基づいてコンテンツが従います。これが私が読んだテキストファイルです:

[Steps]
step1 = WebAddress
step2 = Tab
step3 = SecurityType
step4 = Criteria
step5 = Date
step6 = Click1
step7 = Results
step8 = Download
[data]
WebAddress___________________________ Destination___________ Tab_____________ SecurityType___________________________________________________ Criteria___ Date_______ Click1_ Results_ Download    
https://mbsdisclosure.fanniemae.com/  q:\\%s\\raw\\fnmapool  Advanced Search  Interim MBS: Single-Family                                      Issue Date  09/01/2012  Search  100      CSV XML
https://mbsdisclosure.fanniemae.com/  q:\\%s\\raw\\fnmapool  Advanced Search  Preliminary Mega: Fannie Mae/Ginnie Mae backed Adjustable Rate  Issue Date  09/01/2012  Search  100      CSV XML
https://mbsdisclosure.fanniemae.com/  q:\\%s\\raw\\fnmapool  Advanced Search  Preliminary Mega: Fannie Mae/Ginnie Mae backed Fixed Rate       Issue Date  09/01/2012  Search  100      CSV XML

私はすでにファイルを読み取り、正しいコンテンツを正しいヘッダーに割り当てる作業モデルを持っています (たとえば、ヘッダー WebAdress への url)。しかし、私がやりたいことは、ステップに基づいてループに従うことです。データを処理するコード:

from itertools import groupby
count =0
file_name = "FNMA.tbl"
with open(file_name) as f:
      pre_data,post_data =[s.strip() for s in (f.read()).split("[data]")]
post_data_lines = post_data.splitlines()
headers = post_data_lines[0].split()
headers2 = [s.replace("_"," ").strip() for s in headers]
for line in post_data_lines[1:]:
    tmpline  = []
    pos = 0
    for itm in headers:
        tmpline.append(line[pos:pos+len(itm)])
        pos += len(itm)+1
    myDict= dict(zip(headers2,tmpline))
    count += 1
    for key, group in groupby(myDict.iteritems(), lambda x: x[0]):
        for thing in group:
            print "step: %s header: %s" % (thing[1], key)
    print "Finished processing row %s" % count
4

1 に答える 1

0

まず、次のように、ステップの名前を数値にマッピングする辞書を作成します。

steps = dict((step.split()[2], pos) 
        for (pos, step) in enumerate(pre_data.splitlines()[1:]))

(確かに、これは Python のかなり醜い行ですが、動作するようです)

これで、次の手順で辞書内のアイテムを並べ替えることができます。

sorted_items = sorted(myDict.items(), 
        key=lambda item: steps[item[0]] if item[0] in steps else 999)

そして、それらの項目を繰り返します:

for key, thing in sorted_items:
    print "step: %s header: %s" % (thing, key)
于 2012-09-06T15:34:12.997 に答える