将GeneID与GO号一一对应的两列表格,转换为同一GeneID对应GO号排一行(如图),主要使用字典、列表完成转换。


代码如下
## 先定义一个函数,以空格分割字符串(用来分割ID和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()
## 新建一个空字典
dic_id_GO = {}
## 写一个循环,将ID作为键,GO作为键值;一个ID对应多个GO,所以把键值新建为一个列表
### 写一个判断,如果正在执行的ID与前一行相同,就把GO加到前一个的列表;如果与前一行不同,新建列表(第一行自动新建)
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])
## 新建一个输出文件,可写权限
fo = open('/Users/lichuanshun/Desktop/OUTPUT.txt', 'w')
## 写两个循环:第一个是遍历上述字典,写入字典的键(geneID)
## 第二个是遍历每个键对应的键值(列表),写入输出文件
## 写一个判断,如果是列表中最后一个值,就换行;不是就空格继续写
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()
网友评论