我是一名python初学者,非常感谢有关如何构建脚本的建议。我并不熟悉如何使脚本具有计算效率,这对我当前的任务很重要,因为它将查看大文本文件。 (fyi它的遗传坐标和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列中的相同值。所以如果position是chr2 30我不想要一旦达到chr2 0,它就会向后回到chr1中的值。)对于符合这些条件的每个位置,我会将所有位于这些位置的值(我可以自己做的那部分)加起来,然后输出它们作为得分。 file1中指定的位置。
所以我需要帮助的是如何从文件1读入每个位置,在file2中找到该位置,然后在文件2中先前返回100个位置并开始读取file2中100个以内的所有位置位置越来越大的文件1中指定的位置。然后,一旦完成,输出该站点的值,然后继续读取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)
我很感激有关如何构建该示例代码的任何意见。
如果有任何我需要澄清的话,请告诉我。
提前感谢您的帮助!
最好的问候。