在Python中处理“bed”文件
我有一个.bed文件,里面有1000行,每行的单词是用制表符(\t)分开的。如果把每个单词看作一列的话,每行就有12列。
我需要一种方法把这个.bed文件转换成一个矩阵,这样我就可以方便地访问它的列了。
比如说,我想访问第12列。有没有什么方法可以做到这一点呢?
我已经尝试过这个:
import numpy as np
data = np.genfromtxt("myFile.bed")
但是效果不太好。有没有人能帮帮我呢?
4 个回答
0
另一位用户提到这些文件是用制表符分隔的,叫做TSV文件。我喜欢用pandas来读取这些文件。假设这个文件叫做 amplicon.bed
:
import pandas as pd
bed = pd.read_csv('amplicon.bed', delimiter='\t')
1
我个人在安装 pyranges 的时候遇到了一些麻烦。
我使用了 bed-reader,这是他们提供的示例:
from bed_reader import open_bed, sample_file
bed = open_bed("myFile.bed")
val = bed.read()
2
使用 pyranges,这件事非常简单
import pyranges as pr
path = pr.get_example_path("aorta.bed")
gr = pr.read_bed(path)
# +--------------+-----------+-----------+------------+-----------+--------------+
# | Chromosome | Start | End | Name | Score | Strand |
# | (category) | (int32) | (int32) | (object) | (int64) | (category) |
# |--------------+-----------+-----------+------------+-----------+--------------|
# | chr1 | 9939 | 10138 | H3K27me3 | 7 | + |
# | chr1 | 9953 | 10152 | H3K27me3 | 5 | + |
# | chr1 | 10024 | 10223 | H3K27me3 | 1 | + |
# | chr1 | 10246 | 10445 | H3K27me3 | 4 | + |
# | ... | ... | ... | ... | ... | ... |
# | chr1 | 9978 | 10177 | H3K27me3 | 7 | - |
# | chr1 | 10001 | 10200 | H3K27me3 | 5 | - |
# | chr1 | 10127 | 10326 | H3K27me3 | 1 | - |
# | chr1 | 10241 | 10440 | H3K27me3 | 6 | - |
# +--------------+-----------+-----------+------------+-----------+--------------+
# Stranded PyRanges object has 11 rows and 6 columns from 1 chromosomes.
# For printing, the PyRanges was sorted on Chromosome and Strand.
df = gr.df
# Chromosome Start End Name Score Strand
# 0 chr1 9939 10138 H3K27me3 7 +
# 1 chr1 9953 10152 H3K27me3 5 +
# 2 chr1 10024 10223 H3K27me3 1 +
# 3 chr1 10246 10445 H3K27me3 4 +
# 4 chr1 110246 110445 H3K27me3 1 +
# 5 chr1 9916 10115 H3K27me3 5 -
# 6 chr1 9951 10150 H3K27me3 8 -
# 7 chr1 9978 10177 H3K27me3 7 -
# 8 chr1 10001 10200 H3K27me3 5 -
# 9 chr1 10127 10326 H3K27me3 1 -
# 10 chr1 10241 10440 H3K27me3 6 -
6
BED文件是一种标准的以制表符分隔的文本文件。通常,我们在内存中存储这些文件的内容的方法是:
content = []
with open("myFile.bed")as f:
for line in f:
content.append(line.strip().split())
在这里,你可以用numpy数组代替列表,或者如果你想的话,可以用np.asarray
来转换结果。
其实,你很少需要从中得到一个矩阵,因为这些文件表示的是(基因组?)区间,通常非常大。大多数情况下,你会在循环中对每一行进行修改、读取或执行某个函数:
with open("myFile.bed")as f:
for line in f:
L = line.strip().split()
# ... do something with L
另外,Pandas库实现了类似于R中的“数据框”,不过我自己从来没用过。