Python 多文件比较

Python 多文件比较,python,Python,我想比较多个文件(15-20),它们是gzip文件,并从中恢复常见的行。但这并不是那么简单。某些列中的行是精确的,我也希望它们能够计算出它们存在多少文件中的信息。如果为1,则该行对于文件是唯一的,等等。同时保存这些文件名也很好 每个文件如下所示: ##SAMPLE=<ID=NormalID,Description="Cancer-paired normal sample. Sample ID 'NORMAL'"> ##SAMPLE=<ID=CancerID,Descriptio

我想比较多个文件(15-20),它们是gzip文件,并从中恢复常见的行。但这并不是那么简单。某些列中的行是精确的,我也希望它们能够计算出它们存在多少文件中的信息。如果为1,则该行对于文件是唯一的,等等。同时保存这些文件名也很好

每个文件如下所示:

##SAMPLE=<ID=NormalID,Description="Cancer-paired normal sample. Sample ID 'NORMAL'">
##SAMPLE=<ID=CancerID,Description="Cancer sample. Sample ID 'TUMOR'">
#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  NormalID_NORMAL CancerID_TUMOR
chrX    136109567       .       C       CT      .       PASS    IC=8;IHP=8;NT=ref;QSI=35;QSI_NT=35;RC=7;RU=T;SGT=ref->het;SOMATIC;TQSI=1;TQSI_NT=1;phastCons;CSQ=T|ENSG00000165370|ENST00000298110|Transcript|5KB_downstream_variant|||||||||YES|GPR101|||||        DP:DP2:TAR:TIR:TOR:DP50:FDP50:SUBDP50   23:23:21,21:0,0:2,2:21.59:0.33:0.00   33:33:16,16:13,13:4,4:33.38:0.90:0.00
chrX    150462334       .       T       TA      .       PASS    IC=2;IHP=2;NT=ref;QSI=56;QSI_NT=56;RC=1;RU=A;SGT=ref->het;SOMATIC;TQSI=2;TQSI_NT=2;CSQ=A||||intergenic_variant||||||||||||||| DP:DP2:TAR:TIR:TOR:DP50:FDP50:SUBDP50 30:30:30,30:0,0:0,0:31.99:0.00:0.00     37:37:15,17:16,16:6,5:36.7:0.31:0.00
在我的currenyt代码中,我不知道如何正确地实现if not line.startswith()(哪个位置?),以及如何在行中指定应该匹配的列。更不用说,我不知道如何获取例如在6个文件中存在的行,或者在总共15个文件中的10个文件中存在的行。
有什么帮助吗?

收集字典中的行,其中的字段使它们类似于键:

from collections import defaultdict
d = defaultdict(list)

def process(filename, line):
    if line[0] == '#':
        return

    fields = line.split('\t')
    key = tuple(fields[0:5]) # Fields that makes lines similar/same
    d[key].append((filename, line))

for filename in filenames:
    with gzip.open(filename) as fh:
        for line in fh:
            process(filename, line.strip())
现在,您有了一个包含文件名行元组列表的字典。现在,您可以打印出现10次以上的所有行:

for l in d.values():
   if len(l) < 10: continue

   print 'Same key found %d times:' % len(l)

   for filename, line in l:
       print '%s: %s' % (filename, line)
对于d中的l值()
如果len(l)<10:继续
打印“找到相同的密钥%d次:“%len(l)
对于文件名,l中的行:
打印“%s:%s%”(文件名,行)

收集字典中的行,其中的字段使它们类似于键:

from collections import defaultdict
d = defaultdict(list)

def process(filename, line):
    if line[0] == '#':
        return

    fields = line.split('\t')
    key = tuple(fields[0:5]) # Fields that makes lines similar/same
    d[key].append((filename, line))

for filename in filenames:
    with gzip.open(filename) as fh:
        for line in fh:
            process(filename, line.strip())
现在,您有了一个包含文件名行元组列表的字典。现在,您可以打印出现10次以上的所有行:

for l in d.values():
   if len(l) < 10: continue

   print 'Same key found %d times:' % len(l)

   for filename, line in l:
       print '%s: %s' % (filename, line)
对于d中的l值()
如果len(l)<10:继续
打印“找到相同的密钥%d次:“%len(l)
对于文件名,l中的行:
打印“%s:%s%”(文件名,行)

我有一个以下问题:TypeError:unhable type:d[key]行中的“list”。追加并处理(filename[…]啊,是的。试试
key=tuple(fields[0:5])
这是一个很好的答案,这个概念从一开始就被理解了。我将用漂亮的输出来玩弄自己(顺便说一句,当前的一个已经非常好了,并且允许非常简单的筛选)。许多thanksI都有以下问题:TypeError:不可损坏的类型:第d行[key]中的“list”。追加并处理(文件名[…]啊,是的。请尝试
key=tuple(字段[0:5])
这是一个很好的答案,这个概念从一开始就被理解了。我会用漂亮的输出来玩弄自己(顺便说一句,当前的输出已经很好了,可以很容易地进行过滤)。非常感谢