Python Bed模块

0 投票
2 回答
1623 浏览
提问于 2025-04-16 05:38

我需要创建一个床模块,里面有以下功能:

readBed(file) 
 – 这个函数用来读取一个BED格式的文件,并从里面的数据构建一个基因模型对象的列表。

writeBed(models=models, fname=file) 
 – 这个函数将给定的基因模型对象列表写入一个名为fname的文件中。

关于readBed,我在想可以用我之前写的readline函数,并添加代码让它返回一个列表的结果。至于writeBed,我真的不知道该怎么做。这里是我的代码,大家请给我一些指导:

def ReadBed(file):
  result = []
  line = fh.readline()
  if not line:
      fh.close()
  else:
      return result

def writeBed(models=models, fname=file):
  if file.ReadBed = result
  return result in fname

另外,我有一个像这样的Range类,我想在我的类中引发TypeError和ValueError,但不太确定该怎么做,大家能帮帮我吗?非常感谢大家:

class Range:
  def __init__(self, start, end):
    self.setStart(start)
    self.setEnd(end)
  def getStart(self):
    return self.start
  def setStart(self, s):
    self.start = s
  def getEnd(self):
    return self.end
  def setEnd(self, e):
    self.end = e
  def getLength(self):
    return len(range(self.start, self.end))
  def overlaps(self, r):
    if (r.getStart() < self.getEnd() and r.getEnd() >= self.getEnd()) or \
       (self.getStart() < r.getEnd() and self.getEnd() >= r.getEnd()) or \
       (self.getStart() >= r.getStart() and self.getEnd() <= r.getEnd()) or \
       (r.getStart() >= self.getStart() and r.getEnd() <= self.getEnd()):
      return True
    else:
      return False

2 个回答

2

我先从Range类说起。首先,你不应该使用获取和设置方法,直接用变量就可以了。在Python中,使用获取和设置方法几乎总是不好的做法。即使你需要验证,也可以使用属性来处理。

如果你在用Python 2.x版本,你需要从object继承,这样才能得到新式类。如果你在用Python 3.x,就不需要声明了。

在Python中,方法和函数的命名应该是like_this,而不是likeThis(这是约定俗成的)。

if bool: return True else: return False这样的写法总是可以简化成return bool,这样你的重叠方法就简单多了。如果你稍微想一下逻辑,比较也会变得容易:两个范围要重叠,一个范围必须在另一个范围结束之前开始,并且还要在另一个范围开始之后结束。

关于你的BED函数,你试过运行它们吗?结果怎么样?确保查看一下你在函数中使用的变量以及它们的定义位置。你还应该看看with语句,它通常在打开文件时使用。这个语句提供了设置和清理的钩子,文件句柄会在清理时自动.close()。试试用这个,它也会让逻辑变得更清晰一些。

class Range(object):
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __len__(self):
        """This allows you to do len(Range object)."""
        return self.end - self.start + 1

    def overlaps(self, other):
        if self.start < other.end:
            return self.end > other.start
        if other.start < self.end:
            return other.end > self.start
1

在不知道数据是以什么格式保存到文件里的情况下,我只能猜测它是被序列化了。基于这个猜测,我可以给你以下的代码:

import cPickle

def readBed(filepath):
    with open(filepath, 'r') as f:
        data = cPickle.load(f)
        return data

def writeBed(models, filepath):
    with open(filepath, 'w') as f:
        cPickle.dump(models, f)

撰写回答