Python床模块

时间:2010-10-17 20:27:30

标签: python

我需要创建一个具有以下功能的床模块:

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 个答案:

答案 0 :(得分:2)

我将从Range类开始。首先,您不应该使用get / set方法,而只是使用变量。在python中获取/设置方法几乎总是不好的做法。即使您需要验证,也可以使用属性。

如果您使用的是python 2.x,则需要从object继承以获取新式类。如果您使用py3k,则无需声明它。

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 :(得分:1)

在不知道将数据保存到文件的格式的情况下,我只能假设它是pickled。考虑到这个假设,我可以给你以下代码:

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)