我有一个包含以下数据结构的vcf文件
#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT 2ms01e 2ms02g 2ms03g 2ms04h
2 1738 . A G 4693.24 PASS AC=2;AF=0.250;AN=8;set=Intersection GT:AD:DP:GQ:PB:PC:PG:PI:PL:PW 0|1:389,92:481:99:.,.,.,.,.:1.0:0|1:1020:1748,0,12243:0|1 0/0:318,0:318:99:.:.:0/0:.:0,120,1800:0/0 0|1:270,53:323:99:.,.,.,.,.:1.0:0|1:1258:990,0,9096:0|1 0/0:473,0:473:99:.:.:0/0:.:0,120,1800:0/0
2 1764 . A C 51892.85 PASS AC=5;AF=0.625;AN=8;set=Intersection GT:AD:DP:GQ:PB:PC:PG:PI:PL:PW 1|0:102,415:517:99:.,.,.,.,.:1.0:1|0:1020:12332,0,2817:1|0 1/1:0,356:356:99:.:.:1/1:.:12587,1069,0:1/1 1|0:65,301:366:99:.,.,.,.,.:1.0:1|0:1258:9337,0,1279:1|0 0/1:281,353:634:99:.:.:0/1:.:10325,0,7548:0/1
2 1921 . T C 4465.03 PASS AC=0;AF=0.00;AN=6;set=Intersection GT:AD:DP:GQ:PG:PL:PW 0/0:1,0:1:3:0/0:0,3,35:0/0 ./.:0,0:0:.:./.:0,0,0:./. 0/0:1,0:1:3:0/0:0,3,39:0/0 0/0:2,0:2:6:0/0:0,6,80:0/0
问题: fields
列中的FORMAT
(第9列,基于第8列python)的数量对于所有行都不相同。< / p>
我想阅读此文件并从GT
,PI
和PG
等特定代码中挖掘价值。但是,所有这些标签并不存在于所有线路中;在这种情况下,我只想将值default '.'
因此,文件输出将具有以下结构:
contig pos ref alt_My freq_My GT PI PG
2 1764 A C 0.250 1|0 1020 1|0
2 1921 T C 0.00 0/0 . 0/0
我使用pyVCF模块读取文件以提取这些信息。 以下是我的剧本:
import vcf;
vcf1_data = vcf.Reader(open('MY.phased_variants.Final_sub.vcf', 'r'))
for record in vcf1_data:
contig1 = record.CHROM
pos1 = record.POS
ref_allele1 = record.REF
alt_alleles1 = ",".join(map(str, (record.ALT[::])))
alt_freq1 = ",".join(map(str, (record.INFO['AF'])))
现在,我将这些被调用的值写入output
文本文件:
output = open("My_allele_table.txt", "a")
output.write("{}\t{}\t{}\t{}\t{}"
.format(contig1, pos1, ref_allele1, all_alleles1, all_freq1))
此外,我将其他值附加到输出文件。但是,这样做时我得到AttributeError
,因为PI
字段不存在于所有行中。
不完整的解决方案:我将exception
添加到error
,但之后它只是跳过了读取行的末尾。
for sample in record.samples:
try:
output.write("\t{}\t{}\t{}".format(sample['GT'], sample['PI'], sample['PG']))
except AttributeError:
continue
output.write('\n')
感谢任何帮助!