將GeneID與GO號一一對應(yīng)的兩列表格撒会,轉(zhuǎn)換為同一GeneID對應(yīng)GO號排一行(如圖)朦肘,主要使用字典链方、列表完成轉(zhuǎn)換。
INPUT.png
OUTPUT.png
代碼如下
## 先定義一個(gè)函數(shù)修陡,以空格分割字符串(用來分割I(lǐng)D和GO)
def str_split(lines):
list2 = lines.split()
return list2
## 讀入INPUT文件
f = open('/Users/lichuanshun/Desktop/INPUT.txt', 'r')
lines_2 = f.readlines()
f.close()
## 新建一個(gè)空字典
dic_id_GO = {}
## 寫一個(gè)循環(huán),將ID作為鍵可霎,GO作為鍵值魄鸦;一個(gè)ID對應(yīng)多個(gè)GO,所以把鍵值新建為一個(gè)列表
### 寫一個(gè)判斷癣朗,如果正在執(zhí)行的ID與前一行相同拾因,就把GO加到前一個(gè)的列表;如果與前一行不同旷余,新建列表(第一行自動(dòng)新建)
for i in range(len(lines_2)):
if i == 0:
dic_id_GO[str_split(lines_2[i])[0]] = []
dic_id_GO[str_split(lines_2[i])[0]].append(str_split(lines_2[i])[1])
else:
if str_split(lines_2[i])[0] != str_split(lines_2[i-1])[0]:
dic_id_GO[str_split(lines_2[i])[0]] = []
dic_id_GO[str_split(lines_2[i])[0]].append(str_split(lines_2[i])[1])
else:
dic_id_GO[str_split(lines_2[i])[0]].append(str_split(lines_2[i])[1])
## 新建一個(gè)輸出文件绢记,可寫權(quán)限
fo = open('/Users/lichuanshun/Desktop/OUTPUT.txt', 'w')
## 寫兩個(gè)循環(huán):第一個(gè)是遍歷上述字典,寫入字典的鍵(geneID)
## 第二個(gè)是遍歷每個(gè)鍵對應(yīng)的鍵值(列表)正卧,寫入輸出文件
## 寫一個(gè)判斷蠢熄,如果是列表中最后一個(gè)值,就換行穗酥;不是就空格繼續(xù)寫
for j in dic_id_GO:
fo.write( j + '\t')
for k in range(len(dic_id_GO[j])):
if k < max(range(len(dic_id_GO[j]))):
fo.write( dic_id_GO[j][k] + '\t')
else:
fo.write( dic_id_GO[j][k] + '\n')
fo.close()