Python比较两个文件中的列并返回合并输出

2024-04-19 15:59:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个看起来很简单的问题,但现在已经坚持太久了。我想比较两个文件(格式如下)

> file1
20  246057  0.28    68363   0   A
20  246058  0.28    68396   T   C
20  246059  0.28    76700   A   G
20  246060  0.28    76771   T   C
20  246061  0.28    76915   0   A

> file2
112879285   R   68303   20
200068921   M   68319   20
200257910   K   68336   20
200192457   W   68363   20
138777928   Y   68396   20

我想将file1列0和3与file2列2和3进行比较,如果它们匹配,我希望输出两个文件中匹配行的其余信息,如下所示:

^{pr2}$

这是我到目前为止的代码,我已经尝试了这方面的几个变体和这里的许多建议,但我仍然无法从file1中获得相应的信息。我尝试的大多数操作都会导致每次匹配都重复file1中的最后一行。在

#!/usr/bin/python
import csv

data2 = []
output = open("output.txt","w")

with open("file1.txt", "rb") as in_file1, open("file2.txt","rb") as in_file2:
    reader1 = csv.reader((in_file1), delimiter="\t")
    for row1 in reader1:
        y1 = row1[0], row1[3]
        data2.append(tuple(y1))
        y = row1
    reader2 = csv.reader((in_file2), delimiter="\t")
    for row2 in reader2:
        z = row2[-1], row2[2]
        if tuple(z) in data2:
            out = "\t".join(row2)
            output.write(out+"\n")

我正在努力的部分是在解析之后从file1获取输出。因此,我当前的结果是下面的结果,但我还需要file1中这些行的相应信息:

> current output
200192457   W   68363   20
138777928   Y   68396   20

如有任何帮助或建议,我们将不胜感激!谢谢您!(我使用的是python2.7)


Tags: 文件csvintxt信息outputasopen
3条回答

这是^{}^{},和{a3}的一个很好的用例:

$ join -11 -24 file1 file2 | awk '$4 == $9 { }' | cut -d' ' -f1-8

输出:

^{pr2}$

说明:

  1. 将第一个(-11)和第四个(-24)字段上的两个文件file1和{}连接起来。在
  2. 只过滤第4和第9字段相等的行($4 == $9);打印这些行({ })。在
  3. 从这些行只打印第1到第8个字段(-f1-8)。在

请尝试将代码修改为以下内容,实际上需要在file2中存储与之匹配的行1:

with open("file1.txt", "rb") as in_file1, open("file2.txt","rb") as in_file2:
reader1 = csv.reader((in_file1), delimiter="\t")
for row1 in reader1:
    y1 = row1[0], row1[3]
    reader2 = csv.reader((in_file2), delimiter="\t")
    for row2 in reader2:
        z = row2[-1], row2[2]
        if tuple(z) in [tuple(y1)]:
              out = "\t".join(row1)
              output.write(out+"\n")    
              out = "\t".join(row2)
              output.write(out+"\n")

下面是我从头开始写的解决方案:

f1 = file("file1.txt")
f2 = file("file2.txt")
d = {}
while True:
  line = f1.readline()
  if not line:
    break
  c0,c1,c2,c3,c4,c5 = line.split()
  d[(c0,c3)] = (c0,c1,c2,c3,c4,c5)
while True:
  line = f2.readline()
  if not line:
    break
  c0,c1,c2,c3 = line.split()
  if (c3,c2) in d:
    vals = d[(c3,c2)]
    print c3,vals[1],vals[2],vals[3],vals[4],vals[5],c0,c1

它读取第一个文件,并使用tuple键将值存储到dict中。然后它读取第二个文件,并检查字典中是否存在tuple键。如果是这样,它将打印所有数据。在

请注意,在程序的最终工作版本中,您必须记住关闭这些文件。为了简洁起见,我省略了关闭文件的行。在

相关问题 更多 >