0

Pythonの初心者、私はファイルを読んで基本的な操作を行うことに慣れてきました。ただし、今度は、あるファイルを別のファイルに基づいてフィルタリングしたいと思います。file1をフィルタリングして、file2の列3のスコアが100000未満の行を削除したいと思います。メインデータファイル(file1)があります:

7   303 0.207756232686981
16  23  0.208562019758507
6   57  0.208727272727273
7   80  0.209065354884048
11  124 0.209500609013398

そして、これと同じ新しいデータファイルを作成したいのですが、2番目のファイル(file2)からの情報に基づいて、スコアが100000未満の行を削除します。

chr7    303 292526
chr16   23  169805
chr6    57  62822
chr11   124 320564
chr7    80  300291

両方のファイルの最初の2列には、その行が両方のファイルで同じ大文字と小文字を区別しているかどうかを判断するための情報が含まれています。ただし、2番目のファイルには各番号の前に「chr」が追加されています(この「chr」は無視できます)。最初のファイルのすべての行が2番目のファイルに存在しますが、2番目のファイルには、最初のファイルには無視できる行がいくつかあります。

したがって、線の上の例を見てください。

6   57  0.208727272727273

ファイル2の3列目の値が100,000未満であるため、新しい出力から削除されますが、最初のファイルの他のすべての行は100000を超える値であるため、含まれます。出力ファイルがファイル1と同じ行順。

どんな助けでも大歓迎です。私は通常、のpython構造を使用します

for line in inputfile:
        line = line.rstrip() 
        fields = line.split("\t")

したがって、この構造を構築する答えは非常に素晴らしいでしょう。

質問が不明な場合はお知らせください。

これまでの解決策:

#!/usr/bin/env python



f2 = open( '/mnt/genotyping/CT/GreatApes/HKA/callability/callable_sites_per_region_500Kb.txt', 'r')
d2 = {}
print f2
for line in f2:
    line = line.rstrip()
    fields = line.split("\t")
    key = (fields[0].replace('chr', ''), fields[1])
    d2[key] = int(fields[2])





f1 = open( '/mnt/genotyping/CT/GreatApes/HKA/Barcelona_approach/500kb/cov_5/Homo-Gorilla/R_plots/Gorilla_genome_dist_cov5.txt', 'r')
for line in f1:
    line = line.rstrip()
    fields = line.split("\t")
    if 'region' not in line:
        key = (fields[0], fields[1])
        if d2[key] >= 100000:
            print line

ありがとう

4

1 に答える 1

2

ファイルの代わりに文字列を使用しましたが、原則は同じです。最初に、file2のキーを使用してdictを作成します。

>>> f2 = """chr7\t303\t292526
chr16\t23\t169805
chr6\t57\t62822
chr11\t124\t320564
chr7\t80\t300291"""
>>> d2 = {}
>>> for line in f2.split('\n'):
    line = line.rstrip()
    fields = line.split("\t")
    key = (fields[0].replace('chr', ''), fields[1])
    d2[key] = int(fields[2])


>>> d2
{('7', '303'): 292526, ('7', '80'): 300291, ('16', '23'): 169805, ('6', '57'): 62822, ('11', '124'): 320564}

次に、file1チェック値の行のみを次のように出力しますd2

>>> f1 = """7\t303\t0.207756232686981
16\t23\t0.208562019758507
6\t57\t0.208727272727273
7\t80\t0.209065354884048
11\t124\t0.209500609013398"""
>>> for line in f1.split('\n'):
    line = line.rstrip()
    fields = line.split("\t")
    key = (fields[0], fields[1])
    if d2[key] >= 100000:
        print line


7   303 0.207756232686981
16  23  0.208562019758507
7   80  0.209065354884048
11  124 0.209500609013398
>>> 
于 2012-09-13T07:53:33.133 に答える