在處理文本文件時,很多時候需要我們處理跨行的數據,但是用for循環處理不是很方便,想了一個歪招來處理不是很大的數據。
核心思想就是將上一行的東西存在一個列表里,到下一行用完這個數據在循環體里將列表初始化,再將這行數據存到列表里,這樣循環就可以把兩行數據聯系起來。
另外這樣做的還有另外一個好處,就是可以初始化第一行,我們可以通過判斷這個“傳遞列表”空與否來區分標題行的輸入和其他循環體的輸入情況。
from __future__ import division from sys import argv from itertools import islice Mutation = open('DivFile_sort_chr' + argv[1] +'.txt',"r") REC = open('GeneticMap_Chr' + argv[1],"r") RECList = open('REC_Chr_' + argv[1], "a") transList = [] SNPPosList = [] rholist = [] for lines in islice(Mutation, 1, None): line = lines.strip('\n').split("\t") POS = line[0] SNPPosList.append(POS) print "SNPPos done" for lines in islice(REC, 1, None): line = lines.strip('\n').split("\t") if transList == []: transList.append((line[0],line[1])) RECList.write("position\trate\n") RECList.write('%s\t%s\n' %(line[0],0)) print "headline" else: rho = (float(line[1]) - float(transList[0][1])) / (float(line[0]) - float(transList[0][0])) for i in SNPPosList: if int(i) < int(line[0]) and int(i) > int(transList[0][0]): index = int(SNPPosList.index(i) - 1) site_rho = (int(i) - int(SNPPosList[index])) * rho RECList.write('%s\t%s\n' %(i,site_rho)) else: continue transList = [] transList.append((line[0],line[1],rho)) rholist.append(rho) print rholist for i in SNPPosList: if i > int(transList[0][0]): index = int(SNPPosList.index(i) - 1) site_rho = (int(i) - int(SNPPosList[index])) * rho RECList.write('%s\t%s\n' %(i,site_rho)) else: continue Mutation.close() REC.close() RECList.close()