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
我想创建一个与此相同的新数据文件但是根据第二个文件(file2)中的信息删除任何得分低于100000的行:
chr7 303 292526
chr16 23 169805
chr6 57 62822
chr11 124 320564
chr7 80 300291
两个文件的前两列包含用于确定该行是否在两个文件中引用相同大小写的信息。然而,第二个文件在每个数字之前添加了'chr'(可以忽略此'chr')。 第一个文件中的所有行都存在于第二个文件中,但第二个文件中的某些行不在第一个文件中,可以忽略。
所以看一下上面的例子:
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
由于
答案 0 :(得分:2)
我使用字符串而不是文件,但原则保持不变。 1,创建一个带有file2键的字典:
>>> 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}
然后只在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
>>>