为了账号安全,请及时绑定邮箱和手机立即绑定

将一行的一部分与python中另一个文件中的每一行进行比较

将一行的一部分与python中另一个文件中的每一行进行比较

繁花如伊 2021-04-07 13:15:49
我正在尝试比较一个文件中的一行,并将每条匹配的行放入输出文件中的另一文件中。例如,这是第一个文件。chr8    18      .       T       T       *       *chr8    29      .       C       T       .       .chr9    21      .       TA      T       .       .chr18    22      .       C       T       .       .chr18    23      .       A       G       .       .           然后是另一个文件:chr8    ensembl CDS     1       1042    .       -       0       gene_id "ENSCAFG00000031632"; gene_version "1"; transcript_id "ENSCAFT00000048171"; transcript_version "1"; exon_number "1"; gene_source "ensembl"; gene_biotype "protein_coding"; transcript_source "ensembl"; transcript_biotype "protein_coding"; protein_id "ENSCAFP00000042624"; protein_version "1";chr8    ensembl CDS     27     1227    .       +       0       gene_id "ENSCAFG00000032228"; gene_version "1"; transcript_id "ENSCAFT00000037896"; transcript_version "2"; exon_number "1"; gene_source "ensembl"; gene_biotype "protein_coding"; transcript_source "ensembl"; transcript_biotype "protein_coding"; protein_id "ENSCAFP00000033535"; protein_version "2";因此,我想获取第一个文件的每一行并查找每一行,然后搜索第一列是否匹配,如果第1列匹配,则文件1中的第二个数字在第4列和第5列的范围内。然后,如果它们匹配,则在第一个文件中的各行下写一个新文件,文件2下的所有匹配行都在其下。这是我尝试过的:opt=''with open('file1.vcf') as vfh:    with open('file2.gtf') as gfh:        for line in vfh:                ct=0                vll=line.split('\t')                for gline in gfh:                    gll=gline.split('\t')                    if vll[0] == gll[0]:                        if (int(vll[1]) > int(gll[3])) and (int(vll[1]) < int(gll[4])):                            while ct < 1:                                opt+=line                                ct+=1                            opt+=glinewith open('out.txt','w') as fh:    fh.write(opt)但是我从来没有得到想要的输出。
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

找到了问题,只需要用公开声明来移动我的问题即可。另外,我在原始文件中添加了一些处理一些注释的内容:


with open('a1.vcf') as vfh:

    for line in vfh:

        if '#' not in line[0]:

            ct=0

            vll=line.split('\t')

            with open('cds.gtf') as gfh:

                for gline in gfh:

                    gll=gline.split('\t')

                    if vll[0] == gll[0]:

                        if (int(vll[1]) > int(gll[3])) and (int(vll[1]) < int(gll[4])):

                            while ct < 1:

                                opt+=line

                                ct+=1

                            opt+=gline


查看完整回答
反对 回复 2021-04-27
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我相信您的索引是错误的。

if (int(vll[1]) > int(gll[3])) and (int(vll[1]) < int(gll[4])):

“ vll [1]”是18“ gll [3]”是1042,因为“ ensembl CDS”似乎用“”而不是“ \ t”分隔。请尝试使用调试器并验证索引。


查看完整回答
反对 回复 2021-04-27
  • 2 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号