我需要创建一个具有以下功能的床模块:
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
答案 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)