0

我是这里的 python 初学者,希望获得有关如何构建脚本的建议。我不太熟悉如何使脚本具有计算效率,这对我当前的任务很重要,因为它将查看大型文本文件。(仅供参考,它是遗传坐标和 vcf 格式文件)

我有两个文件。File1 是按数字排序的坐标/位置的制表符分隔列表,例如

chr1 100
chr1 200
chr1 300
chr2 10
chr2 300
chr2 500

File2 是一个制表符分隔的坐标列表,其中包含更多信息,例如

chr1 10 0/1 1/1 0/1 0/0
chr1 100 0/0 1/1 0/0 0/0
chr1 200 0/0 1/1 0/0 0/0
chr1 300 0/0 0/1 0/0 0/0
chr2 10 0/1 1/1 0/1 0/0

file1 中的所有位置都在 file2 中,但文件 2 还包含其他位置。

对于 file1 中的每个位置,我想搜索 file2 并找到该位置。然后,棘手的一点(至少对我而言)是,然后我想查看所有在数字上(第 2 列)<=100 个位置小于该位置且 <=100 个位置大于该位置的位置。因此,如果 file1 中的位置是 chr3 200,我想找到文件 2 中介于 chr3 100 和 chr3 300 之间的所有位置。(它也必须是第 1 列中的相同值。所以如果位置是 chr2 30 我不想要一旦达到 chr2 0,它就会回到 chr1 中的值。)对于每个符合这些标准的位置,我会将这些位置的所有值相加(我可以自己做的那部分),然后将它们作为分数输出file1 中指定的位置。

所以我需要帮助的一点是如何从文件 1 中读取每个位置,在文件 2 中找到该位置,然后在文件 2 中返回 100 个位置并开始读取文件 2 中小于 100 个位置的所有位置,并且大于 file1 中指定的位置。然后,一旦完成,为该站点输出一个值,然后继续读取 file1 中的下一个位置并执行相同的操作。

这是迄今为止我设法完成的代码结构的粗略示例:

file1 =  open('positions.txt', 'w')
file2 =  open('file2.vcf', 'w')
output =   open('output.txt', 'w')

#structure:

for line in file1:
    line = line.rstrip() 
    fields = line.split("\t")
    startposition = fields[0:1]

    for line in file2:
        line = line.rstrip() 
        fields = line.split("\t")

        if fields[0:1] = startposition:
            keep going back in file2 until fields[1] < (startposition[1] - 100)
            read next line (where fields[1] is >= startposition[1] - 100)
            storeddata += fields [2:5]

            continue for lines in file2 until fields[1] > (startposition[1] + 100)
                print >> output, str(startposition), "\t", str(storeddata)

我将不胜感激有关如何构建该代码以及示例代码的任何评论。

如果有什么我需要澄清的,请告诉我。

在此先感谢您的帮助!

此致。

4

0 回答 0