0

テキストファイルがあります。そのファイルの各行には、6つのフィールドまたは7つのフィールドがあります。

  • 1行に7つのフィールドがある場合、最初の6つのフィールドをキーとして作成し、7番目のフィールドをそのキーの値として作成します。

  • 1行に6つのフィールドがある場合、最初の5つのフィールドをキーとして作成し、6番目のフィールドをそのキーの値として作成します。

コード全体を投稿する必要があるかどうかはわかりませんが、わかりやすくするために、コード全体を投稿しています。

私のコードは以下に貼り付けられています:

ReqResRS = {}
with contextlib.nested(open(sys.argv[1],'r'), open(sys.argv[2], 'w')) as (inpf, outf):
    lines = [l.split() for l in inpf if l.strip()]
    for l in lines:
            if(l[6]):
                    myKey = (l[0],l[1],l[2],l[3],l[4],l[5])
                    myValue = l[6]
                    if(myKey in ReqResRS):
                            diff = float(l[6])-float(ReqResRS[myKey]);
                            if(float(diff) < 0.000008):
                                    ReqResRS[myKey] = myValue
                            else:
                                    ReqResRS[myKey] = myValue
                                    outf.write(l[0] + "\t" + l[1] + "\t" + l[2] + "\t" + l[3] + "\t" + l[4] + "\t" + l[5] + "\t" + l[6] + "\n")
                    else:
                            ReqResRS[myKey] = myValue
                            outf.write(l[0] + "\t" + l[1] + "\t" + l[2] + "\t" + l[3] + "\t" + l[4] + "\t" + l[5] + "\t" + l[6] + "\n")
            else:
                    myKey = (l[0],l[1],l[2],l[3],l[4])
                    myValue = l[5]
                    if(myKey in ReqResRS):
                            diff = float(l[5])-float(ReqResRS[myKey]);
                            if(float(diff) < 0.000008):
                                    ReqResRS[myKey] = myValue
                            else:
                                    ReqResRS[myKey] = myValue
                                    outf.write(l[0] + "\t" + l[1] + "\t" + l[2] + "\t" + l[3] + "\t" + l[4] + "\t" + l[5] + "\n")
                    else:
                            ReqResRS[myKey] = myValue
                            outf.write(l[0] + "\t" + l[1] + "\t" + l[2] + "\t" + l[3] + "\t" + l[4] + "\t" + l[5] + "\n")
4

3 に答える 3

3

に変えたいと思いif l[6]ますif len(l) == 7

しかし、この種のことはあなたがそれを作るよりも簡単であるはずです(上記のコードから、あなたはあなたのデータファイルが持っている列の数に基づいて特別な場合のものを必要とするはずです):

myValue = l[-1] 
myKeys = l[:-1]  #tuple(l[:-1]) if you must ...
try:
    diff = float(myValue)-float(ReqResRS[myKey])
    ReqResRS[myKey] = myValue
    if(float(diff) >= 0.000008):
        outf.write("\t".join(l) + "\n") 
except KeyError:
    ReqResRS[myKey] = myValue
    outf.write("\t".join(l) + "\n") 
于 2012-08-17T19:48:00.933 に答える
1
if(l[6]):

配列が不足している場合は失敗します。配列の一部ではない値にアクセスすると、常に例外が発生します。したがって、次のように、配列が十分に長いかどうかを事前に確認する必要があります。

if len(l) == 7:
于 2012-08-17T19:47:52.947 に答える
1

私は5行目にif(l[6]):あるべきだと思いますif(len(l) == 7):

次のようなものを書くこともできることに注意してください

try:
    myKey = (l[0], l[1], l[2], l[3], l[4], l[5])
    myValue = l[6]
except IndexError:
    myKey = (l[0], l[1], l[2], l[3], l[4])
    myValue = l[5]

if(myKey in ReqResRS):
    diff = float(myValue) - float(ReqResRS[myKey]);
    if(float(diff) < 0.000008):
            ReqResRS[myKey] = myValue
    else:
            ReqResRS[myKey] = myValue
            outf.write('{}\t{}\n'.format("\t".join(myKey), myValue)
else:
    ReqResRS[myKey] = myValue
    outf.write('{}\t{}\n'.format("\t".join(myKey), myValue)
于 2012-08-17T19:51:49.560 に答える