1

私は一日中このタスクを実行しようとしてきましたが、Python を使用してそれを実行する方法を本当に学びたいと思っています。1 つは ID のみ、もう 1 つは同じ ID といくつかの説明を含む 2 つのタブ区切りファイルを取得します。共有 ID フィールドでこれらのファイルを UNIX 結合で簡単にマージできますが、そのためには両方を並べ替える必要があり、最初のファイルの順序を維持したいと考えています。

私は以下のいくつかのコードを試しました.私の方法は、タプルに何かを追加しようとすることでした.私の理解では、追加しても順序が維持されます. 私は何かを働かせることができませんでした。誰でも助けることができますか?

サンプル ファイル:

file1 ->
111889
1437390
123
27998
2525778
12
1345

file2 ->
2525778'\t'item778
1345'\t'item110
123'\t'item1000
12'\t'item8889
111889'\t'item1111
1437390'\t'item222
27998'\t'item12

output ->
111889'\t'item1111
1437390'\t'item222
123'\t'item1000
27998'\t'item12
2525778'\t'item778
12'\t'item8889
1345'\t'item110

これは私がこれまでに持っているものです:

import sys

add_list = ()

with open(sys.argv[1], 'rb') as file1, open(sys.argv[2], 'rb') as file2:
        for line2 in file2:
                f1, f2, f3 = line2.split('\t')
                #print f1, f2, f3
                for row in file1:
                        #print row
                        if row != f1:
                                break
                        else:
                                add_list.append(f1,f2,'\n')
                                break  
4

3 に答える 3

3

重要なのは Python辞書を使用することです。Python 辞書はこのタスクに最適です…</p>

ここに完全な答えがあります:

import sys

# Each id is mapped to its item name
# (split() splits at whitespaces (including tabulation and newline), with no empty output strings):
items = dict(line.split() for line in open(sys.argv[2]))  # Inspired by mgilson's answer

with open(sys.argv[1]) as ids:
    for line in ids:
        id = line.rstrip()  # newline removed
        print '{}\t{}'.format(id, items[id])

結果は次のとおりです。

% python out.py file1.txt file2.txt
111889  item1111
1437390 item222
123     item1000
27998   item12
2525778 item778
12      item8889
1345    item110

rbPS:ここでは末尾の改行を削除するため、元の改行バイトを保持する必要がないため、ファイルをモードで開かなかったことに注意してください。

于 2013-10-08T06:16:31.507 に答える
1

ID を 2 番目のファイルのフィールド値にマップする辞書を作成します。

with open('file2') as fin:
   d = dict(x.split(None, 1) for x in fin)

次に、最初のファイルを使用して、辞書から順に出力を作成します。

with open('file1') as fin, open('output', 'w') as fout:
    for line in fin:
        key = line.strip()
        fout.write('{key}\t{value}\n'.format(key=key, value=d[key])
于 2013-10-08T06:18:47.330 に答える
0
out = {}
with open(sys.argv[1], 'rb') as file1, open(sys.argv[2], 'rb') as file2:
    d2 = {}
    for line in file2:
        (key, val) = line.split('\t')
        d2[key] = val
    lines = file1.readlines()
    out = { x:d2[x] for x in lines }

あなたのソート基準についてはわかりません。

于 2013-10-08T06:19:52.820 に答える