根据位置分隔文件中的字母

Separating letters in file based on position

我有一个 .fa 文件,其字母序列如 ACGGGGTTTTGGGCCCGGGGG 和 .txt 文件,其数字显示开始和停止位置,如 start 2 stop 7。我如何才能仅从我的 .fa 文件中的特定位置提取字母并创建仅包含来自指定位置的字母的新文件?我写了这样的代码但是我得到了错误“字符串索引超出范围”我的位置 txtx 文件只是点亮了像 [[1,52],[66,88].....

这样的位置
my_file = open('dna.fa')
transcript = my_file.read()
positions = open('exons.txt')
positions = positions.read()
coding_sequence = '' # declare the variable

for i in xrange(len(positions)):
    start = positions[i][0]
    stop = positions[i][1]
    exon = transcript[start:stop]
    coding_sequence = coding_sequence + exon
print coding_sequence `

假设您的位置存储在名为 positions 的列表中,您的 infile 名称为 infile.fa,outfile 名称为 outfile.fa:

with open("infile.fa") as infile:
    text = infile.read()
    letters = "".join(text[i] for i in positions)
    with open("outfile.fa", "w") as outfile:
        outfile.write(letters)

正如@KIDJourney 的评论中所提到的,理论上,如果文件足够大以至于没有足够的内存来存储它,这可能会失败。如果是这种情况,您可以这样做:

with open("infile.fa") as infile:
    with open("outfile.fa", "a") as outfile:
        outfile.seek(0)
        i = 0
        for line in infile:
            for char in line:
                if i in positions:
                    outfile.write(char)
                i += 1

如果您尝试使用非常大的文件来完成这项工作,@zondo 的解决方案可能会因缺少 RAM 而失败。

当您尝试读取文件的一部分时,您可以使用 seek

def readData(filename , start_pos , end_pos):
    with open(filename) as f :
        f.seek(start_pos)
        data = f.read(end_pos - start_pos)
        return data