我有2个大的.txt文件,每个文件有10列和21008行。我需要获取两个文件的常见行并创建一个新文件。两个文件的第一列包含ID。 2个文件中的一些ID是相似的,但不是全部。新文件将包含公共ID,当然还有完整的行。这是一个小例子:
INPUT1:
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
由于
答案 0 :(得分:0)
读取第一个文件并逐行迭代,每行保留id和line。只有这一次才能为下一个查找公共行,然后按照输出格式附加到列表中:
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))
答案 1 :(得分:0)
您可以使用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
答案 2 :(得分:0)
这是针对您的问题的工作解决方案(使用列表)。最后,您将获得一个列表,其中包含名为“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')