3

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

file1
token1=1234
token2=1245
token3=2345
token4=345


file2
token1=2345
token2=345
token4=4935

file2 にも存在する file1 のすべてのトークンを含む新しいファイルを生成し、ファイル 2 の値であるトークンを保持したいと考えています。これは私のコードですが、何らかの理由でランダムな共通値がありません。

例えば:

ファイル 1 の行は次のとおりです。

IA_ITD_Worst_V = 0y100010100

file2 では次のとおりです。

IA_ITD_WORST_V = 0y100010100

出力ファイルに期待IA_ITD_WORST_V = 0y100010100していますが、表示されません。

私が間違っているかもしれないことを知っている人はいますか?

f1=open("file1","r")
f2=open("file2","r")
f3=open("commonfile.txt","w")

line1=f1.readline()
line2=f2.readline()

for line2 in f2:
    tokenname=line2.split('=')[0].strip()
    for line1 in f1:
        if tokenname==line1.split('=')[0].strip():
               f3.write(line2)

    f1.seek(0) #reset to first line


f1.close()
f2.close()
f3.close()

もっと効率的な方法があると確信していますが、これはうまくいくはずの単純なアプローチですか?

4

4 に答える 4

2

これには辞書を使用します。

filenames = ['file1', 'file2']

mapping = {}

for filename in filenames:
    with open(filename, 'r') as handle:
        for line in handle:
            key, _, value = line.partition('=')
            mapping[key] = value

mappingその後、キー名で並べ替えて、結果を出力ファイルに書き込むことができます。

于 2013-04-03T03:22:18.233 に答える
1

あなたが言ったように、これを行うためのより効率的でクリーンな方法がありますが、特定の質問に答えるには、次の行を削除することから始めます:

line1=f1.readline()
line2=f2.readline()

あなたはそこで行をスキップしています。

EDIT:そのデータ例を追加した後、以下を追加しました。

大文字と小文字を区別しない条件が必要なようですが、これで修正されるはずです:

if tokenname.lower() == line1.split('=')[0].strip().lower():
于 2013-04-03T04:11:21.533 に答える
1

期待どおりの出力が得られない理由は、トークンIA_ITD_Worst_VIA_ITD_WORST_Vが同じではないためです。ケースが異なります。

トークンを大文字と小文字を区別せずに一致させたい場合は、比較する前に小文字にします。例'IA_ITD_Worst_V'.lower() == 'IA_ITD_WORST_V'.lower()

ただし、コードは非常に非効率的です。はるかに良い方法は、許可されたトークンをセットに保持することですが、それらをメモリに保持する必要があります。トークンのリストが大きすぎてメモリに保持できない場合は、データベースを使用してください。

代替実装:

def tokenize(line):
    return line.split('=', 1)[0].strip().lower()

with open('file1', 'r') as f1:
    f1.readline()
    f1tokens = frozenset(tokenize(line) for line in f1)

with open('file2', 'r') as f2, open('commonfile.txt', 'w') as out:
    f2.readline()
    out.writelines(line for line in f2 if tokenize(line) in f1tokens)
于 2013-04-03T03:57:44.857 に答える
1

別のオプションは次のとおりです。

f1 = open('file1.txt', 'r')
f1_tokens = set(line1.split('=')[0].strip() for line1 in f1)

f2 = open('file2.txt', 'r')
for line2 in f2:
    if line2.split('=')[0].strip() in f1_tokens:
        print line2,

使用法:python script.py >commonfile.txt

于 2013-04-03T04:01:22.033 に答える