我是这里的 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)
我将不胜感激有关如何构建该代码以及示例代码的任何评论。
如果有什么我需要澄清的,请告诉我。
在此先感谢您的帮助!
此致。