生信:用python处理26个物种的excel表

前几天老师给我们布置了个任务,我觉得还挺难,于是就发文详细描写一下解决过程。任务描述如下:

老师给的文件如下,只截了部分图,原文件共有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,不明白为啥老师能跑出来。还望评论区各位大佬能解答一下。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值