使用cyvcf2遍历VCF文件时获取样本GT值的问题求助
问题:使用cyvcf2获取VCF样本GT值时出现AttributeError错误
我希望创建一个新的CSV文件,包含VCF文件中的部分行数据(chrom、pos、ref、alt以及各样本的GT值)。但在获取GT值时遇到问题:运行代码中注释的print语句时,抛出错误“AttributeError: 'cyvcf2.cyvcf2.Variant' object has no attribute 'samples'”,尽管我是参考pyvcf文档编写的这段代码。请问应该在vcf_records.append()中alt之后添加什么内容,才能获取所有样本的GT值?
原代码片段:
def foo(vcf_file, input_csv_file, output_csv_file, num_lines=10000): csv_df = pd.read_csv(input_csv_file, sep=';') vcf_reader = cyvcf2.VCF(vcf_file) total_records_vcf = num_lines vcf_records = [] for i, vcf_record in tqdm(enumerate(vcf_reader), total=total_records_vcf): chrom = vcf_record.CHROM pos = vcf_record.POS ref = vcf_record.REF alt = vcf_record.ALT[0] for sample in vcf_record.samples: print(sample['GT']) #this throws an error: AttributeError: 'cyvcf2.cyvcf2.Variant' object has no attribute 'samples' vcf_records.append({'chrom': chrom, 'pos': pos, 'ref': ref, 'alt': alt, ...#here i need to add the GT values for all samples}) ... rest of the code
解决方法
错误原因是混淆了pyvcf和cyvcf2的API,两者样本基因型的获取方式完全不同:cyvcf2的Variant对象没有samples属性,需用以下方式获取GT值:
- 通过
vcf_reader.samples获取VCF文件中所有样本的名称列表 - 用
vcf_record.genotypes获取每个样本的基因型数据,转换为标准GT字符串格式(如0/1) - 将样本名称与对应GT值配对成字典,合并到记录中
修改后的代码片段:
def foo(vcf_file, input_csv_file, output_csv_file, num_lines=10000): csv_df = pd.read_csv(input_csv_file, sep=';') vcf_reader = cyvcf2.VCF(vcf_file) total_records_vcf = num_lines # 获取所有样本名称 sample_names = vcf_reader.samples vcf_records = [] for i, vcf_record in tqdm(enumerate(vcf_reader), total=total_records_vcf): if i >= num_lines: break # 限制读取行数,避免超出设定值 chrom = vcf_record.CHROM pos = vcf_record.POS ref = vcf_record.REF alt = vcf_record.ALT[0] if vcf_record.ALT else None # 转换基因型为"0/1"格式的字符串 gt_strings = [f"{gt[0]}/{gt[1]}" for gt in vcf_record.genotypes] # 构建样本GT的键值对字典 sample_gt_data = dict(zip(sample_names, gt_strings)) # 合并基础字段和样本GT数据 record = { 'chrom': chrom, 'pos': pos, 'ref': ref, 'alt': alt, **sample_gt_data # 展开字典,将每个样本GT作为单独列 } vcf_records.append(record) # 后续将记录转为DataFrame并保存为CSV result_df = pd.DataFrame(vcf_records) result_df.to_csv(output_csv_file, index=False)
关键说明
vcf_reader.samples:返回VCF文件头部定义的所有样本名称列表vcf_record.genotypes:每个元素是一个元组,前两个值对应样本的两个等位基因索引(0代表参考序列REF,1代表第一个变异ALT,以此类推)- 使用
**sample_gt_data可将每个样本的GT值作为单独列添加到CSV中,最终CSV会包含chrom、pos、ref、alt以及每个样本的GT列
内容的提问来源于stack exchange,提问作者barista
相关产品推荐
相关产品推荐

