首页 > 解决方案 > 如何遍历文件的每一行并将该文件的每一行与第二个文件的所有行匹配?

问题描述

我有两个这样的制表符分隔文件:
file1 带有 27,000 行:

0.914482257 chr3    57757816    57757817
0.017355388 chr7    15686237    15686238
0.065539061 chr2    176164345   176164346
2E-05   chr7    149125745   149125746
0.018839033 chr11   94129428    94129429
0.982994402 chr14   93347431    93347432
0.030423226 chr4    38665152    38665153
0.781155125 chr19   12668552    12668553
0.053964176 chr9    71911350    71911351
0.732991838 chr10   103193851   103193852
0.028711544 chr19   55408468    55408469
0.74423941  chr18   44701798    44701799  

file2 有 70,0000,000 行:

chr3    57757810    57757819    1   59  48  0.814   ATGGCCGGTGT
chr1    11780   11780   1   103 99  0.961   GACTGCGCAAA
chr4    38665151    38665153    1   58  52  0.897   TTTGCCGGATT
chr1    11826   11826   1   75  55  0.733   TTAAACGAGAT
chr1    11841   11841   1   22  13  0.591   AGCACCGGGTA
chr1    12520   12520   1   66  31  0.470   AGAGCCGCAGG
chr1    12557   12557   1   50  41  0.820   TAGAACGGAGC
chr10   103193851   103193852   1   96  31  0.323   TCCCACGAAGG
chr18   44701798    44701799    1   53  35  0.660   ACACCCGGCAC   

如果 file1 的第二列 == file2 的第一列和 file1 的第三和第四列等于或介于 file2 的第二和第三列的值之间,我想合并这两个文件;并输出 file1 的第 1,2 和 3 列和 file2 的 6。
输出如下:

chr3    57757816    57757817    0.914482257 0.814
chr4    38665152    38665153    0.030423226 0.897
chr10   103193851   103193852   0.732991838 0.323
chr18   44701798    44701799    0.74423941  0.660

我编写了这个嵌套的 for 循环,它没有给我想要的输出:

f=open("file1.txt")
g=open("file2.txt")
for i in g:
    i = i.rstrip().split("\t")
    for j in f:
        j=j.rstrip().split("\t")
        if int(j[2])>=int(i[1]) and int(j[3])<=int(i[2]) and j[1]==i[0]:
            print(j[1], j[2], j[3], float(j[0]), float(i[6]))  

这是输出:

chr3 57757816 57757817 0.914482257 0.814  

我在循环中添加了一些代码以查看问题。似乎当循环将 file2 的第一行与 file1 的所有行进行比较时,它对 file2 的其他行并没有做同样的事情。
这是我的检查代码:

f=open("file1.txt")
g=open("file2.txt")
for i in g:
    i = i.rstrip().split("\t")
    print(i)
    for j in f:
        j=j.rstrip().split("\t")
        if int(j[2])>=int(i[1]) and int(j[3])<=int(i[2]) and j[1]==i[0]:
            print(j[1], j[2], j[3], float(j[0]), float(i[6]))
        else:
            print("not")  

这是它的输出。

['chr3', '57757810', '57757819', '1', '59', '48', '0.814', 'ATGGCCGGTGT']
chr3 57757816 57757817 0.914482257 0.814
not
not
not
not
not
not
not
not
not
not
not
['chr1', '11780', '11780', '1', '103', '99', '0.961', 'GACTGCGCAAA']
['chr4', '38665151', '38665153', '1', '58', '52', '0.897', 'TTTGCCGGATT']
['chr1', '11826', '11826', '1', '75', '55', '0.733', 'TTAAACGAGAT']
['chr1', '11841', '11841', '1', '22', '13', '0.591', 'AGCACCGGGTA']
['chr1', '12520', '12520', '1', '66', '31', '0.470', 'AGAGCCGCAGG']
['chr1', '12557', '12557', '1', '50', '41', '0.820', 'TAGAACGGAGC']
['chr10', '103193851', '103193852', '1', '96', '31', '0.323', 'TCCCACGAAGG']
['chr18', '44701798', '44701799', '1', '53', '35', '0.660', 'ACACCCGGCAC']

任何帮助,将不胜感激。
谢谢,
瓦希德。

标签: python-3.x

解决方案


我解决了这个问题。我必须在第一个循环中打开我想在第二个循环中迭代的另一个文件:

g=open("file2.txt")
for i in g:
    i = i.rstrip().split("\t")
    with open("file1.txt") as f:
        for j in f:
            j=j.rstrip().split("\t")
            if int(j[2])>=int(i[1]) and int(j[3])<=int(i[2]) and j[1]==i[0]:
                print(j[1], j[2], j[3], float(j[0]), float(i[6]))  

这是输出:

chr3 57757816 57757817 0.914482257 0.814
chr4 38665152 38665153 0.030423226 0.897
chr10 103193851 103193852 0.732991838 0.323
chr18 44701798 44701799 0.74423941 0.66

推荐阅读