將GeneID與GO號(hào)一一對(duì)應(yīng)的兩列表格,轉(zhuǎn)換為同一GeneID對(duì)應(yīng)GO號(hào)排一行(如圖),主要使用字典、列表完成轉(zhuǎn)換。

INPUT.png

OUTPUT.png
代碼如下
## 先定義一個(gè)函數(shù),以空格分割字符串(用來(lái)分割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 = {}
## 寫(xiě)一個(gè)循環(huán),將ID作為鍵,GO作為鍵值;一個(gè)ID對(duì)應(yīng)多個(gè)GO,所以把鍵值新建為一個(gè)列表
### 寫(xiě)一個(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è)輸出文件,可寫(xiě)權(quán)限
fo = open('/Users/lichuanshun/Desktop/OUTPUT.txt', 'w')
## 寫(xiě)兩個(gè)循環(huán):第一個(gè)是遍歷上述字典,寫(xiě)入字典的鍵(geneID)
## 第二個(gè)是遍歷每個(gè)鍵對(duì)應(yīng)的鍵值(列表),寫(xiě)入輸出文件
## 寫(xiě)一個(gè)判斷,如果是列表中最后一個(gè)值,就換行;不是就空格繼續(xù)寫(xiě)
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()