前几天老师给我们布置了个任务,我觉得还挺难,于是就发文详细描写一下解决过程。任务描述如下:
老师给的文件如下,只截了部分图,原文件共有4万多个基因集(虽然我不理解单拷贝 多拷贝基因为什么是1:n,n:1)
一、读取文件
import openpyxl as ol
workbook = ol.load_workbook('E:\OG.xlsx') # 返回一个workbook数据类型的值
sheet = workbook.active
sheet.delete_rows(1)
sheet.delete_cols(1)
num_row = sheet.max_row # 获取行数
num_column = sheet.max_column # 获取列数
sheet.delete是为了删去excel表中的第一行和第一列,去掉字母,方便后续处理。workbook类型仅仅是一个工作蒲,是一个独立的数据区域,我们不好继续满足后面要求其他物种大于2或者1,如果只是一次比较大小,当然好弄,我们可用cell.value指定单元格,问题是要多次比较,按照老师给的数据有42646行,四个判断条件,也就是4乘以42646次,难道都一个个提取吗。
# 读取数据,比如把excel中的一个table按行读取出来,存入一个二维的list
total_list = []
for row in sheet.rows: #sheet.rows是一个迭代器
row_list = []
for cell in row: # 直接从行中取每个cell
row_list.append(cell.value)
total_list.append(row_list)
list1,list2,list3,list4=[0]*26,[0]*26,[0]*26,[0]*26#分别创立1:n,n:1,n:0,orthers的一维列表
目前我能想到的就是创建几个这样的列表来接受我们的数据以满足条件。
二、按条件筛选
创建a这个列表最开始我是想除去我们要找的这个物种的数字,再一个一个和2比大小,但我写numpy.array(a)>=2.all()它说列表和int不能用>=
所以。。。如果找的是1的话,其他的物种基因数要求大于等于2,那不就可以25✖2+1吗?于是用sum函数求列表和。
三、创建新的excel
还是在原先的excel表里,新建一个表头为test的sheet。
# 创建新的表
workbook.create_sheet("test")
sheet2 = workbook["test"]
data = [
['Acgr', 'Adca', 'Amtr', 'Anco', 'Aqco', 'Arfi' 'Arth' 'Busi', 'Cede' ,'Chse' ,'Cika','Cypa', 'Elgu', 'Eufe', 'Gibi', 'Ilve', 'Lich', 'Nenu', 'Nyco', 'Orsa', 'Pita', 'Potr', 'Scch', 'Sppo', 'Vivi', 'Scch.merge.unigene'],
list1,list2,list3,list4
]
for row in data:
sheet2.append(row)
workbook.save('E:\OG.xlsx')
大功告成,贴结果图
这里要提醒一下,跑代码时要把excel文件关了,不然会[Error13]
四、小问题
其实老师也给了我们一个代码,但班上同学好像没人跑出来,如下:贴图
我跑的话总是报TypeError: 'builtin_function_or_method' object is not subscriptable,不明白为啥老师能跑出来。还望评论区各位大佬能解答一下。