Python Bed模块
我需要创建一个床模块,里面有以下功能:
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 个回答
我先从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
在不知道数据是以什么格式保存到文件里的情况下,我只能猜测它是被序列化了。基于这个猜测,我可以给你以下的代码:
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)