[ PROMPT_NODE_27168 ]
alignment_files
[ SKILL_DOCUMENTATION ]
# 处理比对文件 (SAM/BAM/CRAM)
## 概述
Pysam 提供了 `AlignmentFile` 类,用于读写包含比对序列数据的 SAM/BAM/CRAM 格式文件。BAM/CRAM 文件支持压缩,并通过索引支持随机访问。
## 打开比对文件
通过模式限定符指定格式:
- `"rb"` - 读取 BAM (二进制)
- `"r"` - 读取 SAM (文本)
- `"rc"` - 读取 CRAM (压缩)
- `"wb"` - 写入 BAM
- `"w"` - 写入 SAM
- `"wc"` - 写入 CRAM
python
import pysam
# 读取
samfile = pysam.AlignmentFile("example.bam", "rb")
# 写入 (需要模板或头信息)
outfile = pysam.AlignmentFile("output.bam", "wb", template=samfile)
### 流式处理
使用 `"-"` 作为文件名进行标准输入/输出 (stdin/stdout) 操作:
python
# 从 stdin 读取
infile = pysam.AlignmentFile('-', 'rb')
# 写入 stdout
outfile = pysam.AlignmentFile('-', 'w', template=infile)
**重要:** Pysam 不支持从真正的 Python 文件对象读写,仅支持 stdin/stdout 流。
## AlignmentFile 属性
**头信息:**
- `references` - 染色体/重叠群 (contig) 名称列表
- `lengths` - 每个参考序列对应的长度
- `header` - 以字典形式表示的完整头信息
python
samfile = pysam.AlignmentFile("example.bam", "rb")
print(f"References: {samfile.references}")
print(f"Lengths: {samfile.lengths}")
## 读取 Reads
### fetch() - 基于区域的检索
使用 **0-基坐标** 检索与指定基因组区域重叠的 reads。
python
# 获取特定区域
for read in samfile.fetch("chr1", 1000, 2000):
print(read.query_name, read.reference_start)
# 获取整个重叠群
for read in samfile.fetch("chr1"):
print(read.query_name)
# 无索引获取 (顺序读取)
for read in samfile.fetch(until_eof=True):
print(read.query_name)
**重要提示:**
- 随机访问需要索引 (.bai/.crai)
- 返回与区域 **重叠** 的 reads(可能会延伸到边界之外)
- 对于未索引文件或顺序读取,使用 `until_eof=True`
- 默认情况下,仅返回已比对的 reads
- 对于未比对的 reads,使用 `fetch("*")` 或 `until_eof=True`
### 多重迭代器
在同一文件上使用多个迭代器时:
python
samfile = pysam.AlignmentFile("example.bam", "rb", multiple_iterators=True)
iter1 = samfile.fetch("chr1", 1000, 2000)
iter2 = samfile.fetch("chr2", 5000, 6000)
如果不设置 `multiple_iterators=True`,新的 fetch() 调用会重置文件指针并中断 ex