所以我有一个包含表格的数千个条目的文件(fasta格式,如果有人想知道的话):
>scaffold1110_len145113_cov91
TAGAAAATTGAATAATTGATAGTTCTTAACGAAAAGTAAAAGTTTAAAGTATACAGAAATTTCAGGCTATTCACTCTTTT
ATAATCCAAAATTAGAAATACCACACCTTGCATAAAGTTTAAGATATTTACAAAAACCTGAAGTGGATAATCCGAAATCG
...
>Next_Header
ATGCTA...
我的部分代码中包含一个python-dictionary,其中包含许多标题的以下信息:
{'scaffold1110_len145113_cov91': [[38039, 38854, 106259], [40035, 40186, 104927]]}
这描述了标题的输入以及该条目中的起始位置,结束位置和其余字符的列表(因此start = 1表示该对应标题下面的行的第一个字符)。 [开始,结束,离开]
我想要做的是提取此间隔的字符串,包括前面和后面的25个(或可变数字)字符,如果条目允许,否则包括所有字符到开头/结尾。 (比如当开始位置为8时,我不能在前面包括25个字符,但只包含8个字符。)
对于我的词典中的每一个条目。
听起来不太难,但我正在努力想出一个聪明的方法去做。
现在我的想法是从我的文件中读取行,检查它们是否以">"开头。并查看它们是否存在于我的词典中。然后将每行的字符加起来,直到它们超过我的起始位置,并从那里以某种方式设法获得该行的正确部分以匹配我的startPos - X
。
for line in genomeFile:
line = line.strip()
if(line[0] == ">"):
header = line
currentCluster = foundClusters.get(header[1:])
if(currentCluster is not None):
outputFile.write(header + "\n")
if(currentCluster is not None):
charCount += len(line)
# *crazy calculations to find the actual part i want to extract*
我是蟒蛇初学者,所以也许有人有更好的想法如何解决这个问题?
- 在键入此内容时,我想到在一行与我正在寻找的字符匹配之后使用file.read(startPos-X-1)来读取字符以便从我那里使用文件。 read((endPos + X - startPos-X))来提取我正在寻找的部分。如果这样可行,那么完成我想要的东西似乎很容易。
无论如何,我会发布这个帖子,也许有人会有更好的方式,或者我的想法可能无法发挥作用。感谢任何意见。
编辑:
原来你不能将for line in file
与file.read(x)
混合,因为前者使用缓冲,soooooo回到了batcave。 file.read(x)也可能计算换行符,我的开始和结束位置的数据都没有。
(还修复了我发布的代码中的一些愚蠢错误)
答案 0 :(得分:0)
也许您可以使用函数来生成所需的拼接索引。
def biggerFrame( start, end, left, frameSize=25 ) : #defaults to 25 frameSize
newStart = start - frameSize
if newStart < 0 :
newStart = 0
if frameSize > left :
newEnd = left
else :
newEnd = end + frameSize
return newStart, newEnd
使用该功能,您可以在代码中添加以下内容。
for indices in currentCluster :
slice, dice = biggerFrame( indices[0], indices[1], indices[2], 50) # frameSize is 50 here; you can make it whatever you want.
outputFile.write(line[slice:dice] + '\n')