[ PROMPT_NODE_27174 ]
variant_files
[ SKILL_DOCUMENTATION ]
# 使用变异文件 (VCF/BCF)
## 概述
Pysam 提供了 `VariantFile` 类,用于读取和写入 VCF (变异调用格式) 和 BCF (二进制 VCF) 文件。这些文件包含有关遗传变异的信息,包括 SNP、插入缺失 (indels) 和结构变异。
## 打开变异文件
python
import pysam
# 读取 VCF
vcf = pysam.VariantFile("example.vcf")
# 读取 BCF (二进制,压缩)
bcf = pysam.VariantFile("example.bcf")
# 读取压缩的 VCF
vcf_gz = pysam.VariantFile("example.vcf.gz")
# 写入
outvcf = pysam.VariantFile("output.vcf", "w", header=vcf.header)
## VariantFile 属性
**头部信息:**
- `header` - 包含元数据的完整 VCF 头部
- `header.contigs` - 重叠群/染色体字典
- `header.samples` - 样本名称列表
- `header.filters` - FILTER 定义字典
- `header.info` - INFO 字段定义字典
- `header.formats` - FORMAT 字段定义字典
python
vcf = pysam.VariantFile("example.vcf")
# 列出样本
print(f"Samples: {list(vcf.header.samples)}")
# 列出重叠群
for contig in vcf.header.contigs:
print(f"{contig}: length={vcf.header.contigs[contig].length}")
# 列出 INFO 字段
for info in vcf.header.info:
print(f"{info}: {vcf.header.info[info].description}")
## 读取变异记录
### 遍历所有变异
python
for variant in vcf:
print(f"{variant.chrom}:{variant.pos} {variant.ref}>{variant.alts}")
### 获取特定区域
需要 VCF.gz 的 tabix 索引 (.tbi) 或 BCF 的索引:
python
# 获取区域内的变异 (区域字符串使用 1-based 坐标)
for variant in vcf.fetch("chr1", 1000000, 2000000):
print(f"{variant.chrom}:{variant.pos} {variant.id}")
# 使用区域字符串 (1-based)
for variant in vcf.fetch("chr1:1000000-2000000"):
print(variant.pos)
**注意:** `fetch()` 调用中使用 **1-based 坐标**以符合 VCF 规范。
## VariantRecord 对象
每个变异表示为一个 `VariantRecord` 对象:
### 位置信息
- `chrom` - 染色体/重叠群名称
- `pos` - 位置 (1-based)
- `start` - 起始位置 (0-based)
- `stop` - 终止位置 (0-based,不包含)
- `id` - 变异 ID (例如 rsID)
### 等位基因信息
- `ref` - 参考等位基因
- `alts` - 替代等位基因元组
- `alleles` - 所有等位基因元组 (ref + alts)
### 质量和过滤
- `qual` - 质量分数 (QUAL 字段)
- `filter` - 过滤状态
### INFO 字段
访问 INFO 字段为