Python:根据字符索引从文本文件中提取子字符串

时间:2015-10-22 10:27:53

标签: python string file extract

所以我有一个包含表格的数千个条目的文件(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 filefile.read(x)混合,因为前者使用缓冲,soooooo回到了batcave。 file.read(x)也可能计算换行符,我的开始和结束位置的数据都没有。

(还修复了我发布的代码中的一些愚蠢错误)

1 个答案:

答案 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')