0

私は2つのファイルを持っています

ファイル1:

IdName1 Info1 Info2 Info3   #Info: from program1 for name1  #Info: from program2 for name1
IdName2 Info1 Info2 Info3   #Info: from program1 for name2  #Info: from program2 for name2
IdName4 Info1 Info2 Info3   #Info: from program1 for name4  
IdName3 Info1 Info2 Info3   #Info: from program1 for name3  #Info: from program2 for name3

ファイル 2:

# ProgramInfo
# Query: IdName1 Info1 Info2 Info3
# DatabaseInfo
# FiledInfo
line1
line2
# ProgramInfo
# Query: IdName2 Info1 Info2 Info3
# DatabaseInfo
# FiledInfo
# ProgramInfo
# Query: IdName4 Info1 Info2 Info3
# DatabaseInfo
# FiledInfo
line1
line2
line3
line4

ここで、「IdName1 Info1 Info2 Info3」が「#Query:」の後に File2 にあるかどうかを確認する必要があります。そうである場合は、File1 のその行から iformation を分割し、対応する「# ProgramInfo」行の前に File2 に挿入する必要があります。 . 出力ファイルは次のようになります。

出力ファイル:

# IdName1 Info1 Info2 Info3
# Info: from program1 for name1 
# Info: from program2 for name1
# ProgramInfo
# Query: IdName1 Info1 Info2 Info3
# DatabaseInfo
# FiledInfo
line1
line2
# IdName2 Info1 Info2 Info3 
# Info: from program1 for name2 
# Info: from program2 for name2
# ProgramInfo
# Query: IdName2 Info1 Info2 Info3
# DatabaseInfo
# FiledInfo
# IdName4 Info1 Info2 Info3 
# Info: from program1 for name4 
# ProgramInfo
# Query: IdName4 Info1 Info2 Info3
# DatabaseInfo
# FiledInfo
line1
line2
line3
line4

私の質問は、対応する 3 行を File2 に追加する方法です。次のようなことを試みています。

import sys
def programs_info_comb(fileName1, fileName2):
    my_file1 = open(fileName1, "r")
    my_line1=my_file1.readlines()
    my_file2 = open(fileName2, "r")
    my_line2=my_file2.readlines() 
    for line1 in my_line1: 
        (name1, info1, info2)= line1.strip().split("\t")
        for line2 in my_line2:
            if line2.startswith("# Q"):
                name2 = line2[9:-1]
                if name1 == name2:
                    #### here Im lost how to tell where I want those next two lines to be printed
                    print "#"+" "+name1
                    print info1
                    print info2
    my_file1.close
    my_file2.close
if __name__== "__main__":
    programs_info_comb(sys.argv[1], sys.argv[2])

これにはおそらくもっと簡単な方法があります。すべての助けがありがたく受け入れられます

4

2 に答える 2

0
import sys
def programs_info_comb(fileName1, fileName2):
    my_file1 = open(fileName1, "r")
    my_line1=my_file1.readlines()
    my_file1.close()

    my_file2 = open(fileName2, "r")
    my_line2=my_file2.readlines() 
    my_file2.close()

    # load file1 into a dict for lookup later
    infoFor = dict()
    for line1 in my_line1: 
        parts = line1.strip().split("\t")
        infoFor[parts[0]] = parts[1:] 

    # iterate over line numbers to be able to refer previous line numbers
    for line2 in range(len(my_line2)):
        if my_line2[line2].startswith("# Q"):
            name2 = my_line2[line2][9:-1]
            # lookup
            if infoFor.has_key(name2):
                print '# ' + name2
        for info in infoFor[name2]:
                    print info
            # print programinfo and query lines
                print my_line2[line2-1],
                print my_line2[line2],
    # skip program info always
        elif my_line2[line2].startswith("# ProgramInfo"):
            pass
    # otherwise just print as is
        else:
            print my_line2[line2],

if __name__== "__main__":
    programs_info_comb(sys.argv[1], sys.argv[2])

後で検索するために file1 をディクショナリにロードし、出力を stdout に送信しました。出力を送信する前に、現在の回線のタイプを確認し、それに応じて出力しました。

これがo / pです:-

C:\>python st.py f1.txt f2.txt
# IdName1 Info1 Info2 Info3
#Info: from program1 for name1
#Info: from program2 for name1
# ProgramInfo
# Query: IdName1 Info1 Info2 Info3
# DatabaseInfo
# FiledInfo
line1
line2
# IdName2 Info1 Info2 Info3
#Info: from program1 for name2
#Info: from program2 for name2
# ProgramInfo
# Query: IdName2 Info1 Info2 Info3
# DatabaseInfo
# FiledInfo
# IdName4 Info1 Info2 Info3
#Info: from program1 for name4
# ProgramInfo
# Query: IdName4 Info1 Info2 Info3
# DatabaseInfo
# FiledInfo
line1
line2
line3
line4
于 2012-12-12T13:11:26.150 に答える
0

これを行うためのより良い方法がおそらくありますが、ここでは機能する 1 つの方法を示します。

def programs_info_comb(f1, f2):
    tmp = open(f1, "r")
    file1 = tmp.readlines()
    tmp.close()

    tmp = open(f2, "r")
    file2 = tmp.readlines()
    tmp.close()

    for line in file1:
        content = line.split("#")[0].strip()
        for i, line in enumerate(file2.copy()):
            if line == "# Query: %s\n" %content:
                file2.insert(i-1, "# %s\n" %content)
                break

    tmp = open("output.txt", "w")
    tmp.writelines(file2)
    tmp.close()

コメント セクションに記載されているように、データベースも確認する必要があります。

forまた、特定の状況下では、2 つの入れ子になったループを避けることができます。ただし、これは完全に機能する方法であり、要求したことを実行します。

于 2012-12-12T12:56:22.077 に答える