在Python中处理“bed”文件

2 投票
4 回答
14832 浏览
提问于 2025-04-18 16:37

我有一个.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中的“数据框”,不过我自己从来没用过。

撰写回答