2017-03-05 2 views
0

本質的には、コードで参照されるIDリストに一致するドキュメントの行を書きたい。別のファイルの文字と一致する行を書き込む

nodeIDs.txt:

...

10000 
10023 
1017 
1019 
1021 
1026 
1027 
1029 
... 

アドヘレンjunction.txt、417個のオブジェクト有する:

を...は

、73行を有します
4301: AFDN; afadin, adherens junction formation factor 
1496: CTNNA2; catenin alpha 2 
283106: CSNK2A3; casein kinase 2 alpha 3 
2241: FER; FER tyrosine kinase 
60: ACTB; actin beta 
1956: EGFR; epidermal growth factor receptor 
56288: PARD3; par-3 family cell polarity regulator 
10458: BAIAP2; BAI1 associated protein 2 
51176: LEF1; lymphoid enhancer binding factor 1 

私はプログラムを行ごとに実行し、idリストを参照し、行の先頭文字がリスト内にある文字のいずれかと一致していれば、その行を新しいドキュメントに書き込もうとしています。私はデータセットを研究していましたが、ここでうまくいくかどうかは分かりませんでした。これまで

マイコード:

ids = [] 
with open('nodeIDs.txt', 'r') as n: 
    for line in n: 
     ids.append(line) 
n.close() 

# Import data from the pathway file and turn into a list 
g = [] 
with open('Adherens junction.txt', 'r') as a: 
    for line in a: 
     g.append(line) 
a.close() 

aj = open('Adherens.txt', 'a') 
for line in a: 
    if ids[i] in line: 
    aj.write(line) 
aj.close() 

はあなたが私はこの作業を得るのを助けることはできますか?

+0

# create a set ids = set() for line in f: ids.add(line.strip()) 
[最小、完全、かつ検証](http://stackoverflow.com/ help/mcve)の例です。具体的には、動作するデータであり、提供されるデータからの形式と予想される出力のみを示すものではありません。 –

答えて

2

あなたが何をしていると思いますか?

コード:

# read ids file into a set 
with open('file1', 'r') as f: 
    # create a set comprehension 
    ids = {line.strip() for line in f} 

# read the pathway file and turn into a list 
with open('file2', 'r') as f: 
    # create a list comprehension 
    pathways = [line for line in f] 

# output matching lines 
with open('file3', 'a') as f: 

    # loop through each of the pathways 
    for pathway in pathways: 

     # get the number in front of the ':' 
     start_of_line = pathway.split(':', 1)[0] 

     # if this is in 'ids' output the line 
     if start_of_line.strip() in ids: 
      f.write(pathway) 

結果:

2241: FER; FER tyrosine kinase 
56288: PARD3; par-3 family cell polarity regulator 

FILE1:

10000 
56288 
2241 

FILE2:

4301: AFDN; afadin, adherens junction formation factor 
1496: CTNNA2; catenin alpha 2 
283106: CSNK2A3; casein kinase 2 alpha 3 
2241: FER; FER tyrosine kinase 
60: ACTB; actin beta 
1956: EGFR; epidermal growth factor receptor 
56288: PARD3; par-3 family cell polarity regulator 
10458: BAIAP2; BAI1 associated protein 2 
51176: LEF1; lymphoid enhancer binding factor 1 

セットの理解とは何ですか?

これ:

# create a set comprehension 
ids = {line.strip() for line in f} 

と同じである:この質問は大幅で改善されるであろう

+0

これは完全に機能しました - フォーマットにも感謝します!あなたのコードの "line for line"と "pathways in pathways"セクションで何が起こっているのかをもう少し説明できますか? – Quintakov

+1

'for line in lines'は、標準のPythonイテレータです。多くのオブジェクト(例: 'list')は、この非常に気の利いた構文を可能にする' __next__'メソッドを実装しています。ですから、基本的には読み込み時に行ごとに1つずつforループを実行します。 Pythonは楽しいものではありませんか?あなたはまた、理解に慣れていないかもしれません。私は2つの内包に注意するために投稿を更新しました。参照:http://stackoverflow.com/questions/1747817/create-a-dictionary-with-list-comprehension-in-python –

関連する問題