【问题标题】:Common rows of two .txt files in pythonpython中两个.txt文件的共同行
【发布时间】:2016-08-10 00:08:05
【问题描述】:

我有 2 个大的 .txt 文件,每个文件有 10 列和 21008 行。我需要获取两个文件的公共行并创建一个新文件。两个文件的第一列包含 ID。 2 个文件中的一些 ID 相似,但不是全部。新文件将包含公共 ID,当然还有完整的行。这是一个小例子:

输入1:

ENSG00000137288.5   0,111111112 0,099415205 0,894736842 
ENSG00000116085.9   0,086826347 0,152694613 1,758620722 
ENSG00000167578.12  0,052093968 0,096016347 1,843137535 
ENSG00000167531.2   0,042553194 0,085106388 2   
ENSG00000078237.4   0,016129032 0   0   0,031746034 

输入2:

ENSG00000137288.5   0,167213112 0,134426236 0,803921621 
ENSG00000116032.5   0,094311371 0,144461095 1,531746311 
ENSG00000167578.12  0,062894806 0,101620428 1,615720507 
ENSG00000103227.14  0,067720085 0,068472534 1,011111165 
ENSG00000078241.8   0,016260162 0,040650405 2,5 

输出文件:

ENSG00000137288.5   0,111111112 0,099415205 0,894736842 ENSG00000137288.5   0,167213112 0,134426236 0,803921621     
ENSG00000167578.12  0,052093968 0,096016347 1,843137535 ENSG00000167578.12  0,062894806 0,101620428 1,615720507     

谢谢

【问题讨论】:

  • 其中一个文件可能包含重复行吗?
  • 没有。每个文件中没有重复的行。
  • 我不介意是否包括在内。

标签: python text


【解决方案1】:

读取第一个文件并逐行迭代,每行保留id和行。只为下一个执行此操作,通过 id 查找公共行,然后附加到输出格式的列表中:

ids = {}
found = []
with open(filepath1) as file1:
    for line in file1.lines():
        id_ = line.split()[0]
        ids[id_] = line

with open(filepath2) as file2:
    for line in file2.lines():
        id_ = line.split()[0]
        if id_ in ids:
            found.append("{} {}".format(ids[id_], line))

【讨论】:

    【解决方案2】:

    您可以使用dict 来跟踪第二个文件中看到的行,以允许第一个设置顺序:

    d2={}
    with open("f2.txt") as f2:
        for line in f2:
            k,_,v=line.partition(' ')
            d2[k]=line.strip()
    
    with open("f1.txt") as f1:
        for line in f1:
            k,_,v=line.partition(' ')
            if k in d2:
                print line.strip(), d2[k]
    

    打印:

    ENSG00000137288.5   0,111111112 0,099415205 0,894736842 ENSG00000137288.5   0,167213112 0,134426236 0,803921621
    ENSG00000167578.12  0,052093968 0,096016347 1,843137535 ENSG00000167578.12  0,062894806 0,101620428 1,615720507
    

    【讨论】:

      【解决方案3】:

      这是解决您问题的有效解决方案(使用列表)。最后,您将获得一个列表,其中包含一个名为“res”的文件中具有相同 ID 的所有行

      l1 = []
      l2 = []
      
      with open('file1', 'r') as f1:
          for line in f1:
              line = line.split()
              l1.append(line)
      
      with open('file2', 'r') as f2:
          for line in f2:
              line = line.split()
               l2.append(line)
      
      res = [i + j for i, j in zip(l1, l2) if i[0] == j[0]]
      
      target = open('res', 'w')
      for i in res:
          for j in i:
              target.write(j)
              target.write(' ')
          target.write('\n')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 2020-10-27
        • 2017-10-02
        • 2014-11-21
        • 1970-01-01
        • 2016-01-12
        相关资源
        最近更新 更多