python实战之实现excel读取、统计、写入
背景
图像领域内的一个国内会议快要召开了,要发各种邀请邮件,之后要录入、统计邮件回复(参会还是不参会等)。如此重要的任务,老师就托付给我了。ps: 统计回复邮件的时候,能知道谁参会或谁不参会。
而我主要的任务,除了录入邮件回复,就是统计理事和普通会员的参会情况了(参会的、不参会的、没回复的)。录入邮件回复信息没办法只能人工操作,但如果统计也要人工的话,那工作量就太大了(比如在上百人的列表中搜索另外上百人在不在此列表中!!),于是就想到了用python来帮忙,花两天时间不断修改,写了6个版本。。。
摘要
- version_1基本实现了
excel
读取、统计、显示功能,但问题也有不少,像显示出来后还要自已复制、粘贴到excel
表,而且set
中还有nan
这样的bug。 version_2
相比较version_1
而言,此版本用set
代替list
,可以自动去重。version_3
解决了set
中出现nan
的bug,而且还加入的excel写入的功能,但一次只能写入一张表,所以要运行两次才能写入两张表(sheet)。version_4
的改进在于将version_3
中写入两张表格的操作,集成在一个程序里,只需要运行一次便可写入两张表,但也总是会写入两张表,万一你只想写入一张表呢??version_5
相对之前版本的最大改进在于将程序模块化,更具可读性了; 对修复set中出现nan
的方法也进行了改进和简化; 而且可以自由控制写入多少张表了。version_final
相比较version_5
,修复了一个bug,之前需要先验知识,现在更通用一点(prep
函数取代了set2list
函数)。
version_1
基本实现了excel
读取、统计、显示功能,但问题也有不少,像显示出来后还要自已复制、粘贴到excel
表,而且set
中还有nan
这样的值。
#version_1
import os
import numpy as np
import pandas as pd
os.chdir('C:\\Users\\dell\\Desktop\\0711任务')
print(os.getcwd())
data = pd.read_excel('for_python.xlsx','Sheet2')
return_set = set(data['回执名单'])
demand_set = set(data['理事名单'])
answer_list = []
unanswer_list = []
for each in demand_set:
if each in return_set:
answer_list.append(each)
else:
unanswer_list.append(each)
notattend_set = set(data['回执名单'][-15:])
nt = []
for each in notattend_set:
if each in answer_list:
nt.append(each)
def disp(ll, cap, num = True):
print(cap)
if num:
for i, each in enumerate(ll):
print(i+1,each)
else:
for each in enumerate(ll):
print(each)
disp(answer_list,'\n理事回执名单')
disp(unanswer_list,'\n理事未回执名单')
disp(nt,'\n理事回执说不参加名单')
version_2
相比较上一个版本,此版本用set
代替list
,可以自动去重。
#version_2
import os
import numpy as np
import pandas as pd
os.chdir('C:\\Users\\dell\\Desktop\\0711任务')
print(os.getcwd())
data = pd.read_excel('for_python.xlsx','Sheet2')
return_set = set(data['回执名单'])
demand_set = set(data['理事名单'])
answer_set = set([]) #理事回执名单
unanswer_set = set([]) #理事未回执名单
for each in demand_set:
if each in return_set:
answer_set.add(each)
else:
unanswer_set.add(each)
notattend_set = set(data['回执名单'][-17:])
nt = set([]) #理事回执说不参加名单
for each in notattend_set:
if each in answer_set:
nt.add(each)
ans_att_set = answer_set - nt #理事回执参加名单
def disp(ss, cap, num = False):
print(cap)
if num:
for i, each in enumerate(ss):
print(i+1,each)
else:
for each in ss:
print(each)
#disp(answer_set,'\n理事回执名单')
disp(ans_att_set,'\n理事回执说参加名单')
disp(nt,'\n理事回执说不参加名单')
disp(unanswer_set,'\n理事未回执名单')
print(len(ans_att_set),len(nt),len(unanswer_set))
version_3
此版本解决了set
中出现nan
的bug,而且还加入的excel写入的功能,但一次只能写入一张表,所以要运行两次才能写入两张表(sheet)。
step_1
import os
import numpy as np
import pandas as pd
os.chdir('C:\\Users\\dell\\Desktop')
print('work_directory: ', os.getcwd())
data = pd.read_excel('理事与会员名单.xlsx','理事与会员名单')
#1.载入excel,得到三个名单
ans_attend_set = set(data['回执参加']) #回执参会名单
N = len(ans_attend_set)
ans_notatt_idx = [i for i in range(N) if type(data['回执不参加'][i]) == np.float][0]
ans_notatt_set = set(data['回执不参加'][:ans_notatt_idx])#回执不参会名单
concil_idx = [i for i in range(N) if type(data['理事名单'][i]) == np.float][0]
concil_set = set(data['理事名单'][:concil_idx]) #理事名单
#2.统计理事参会情况
concil_attend_set = set([]) #理事回执参会名单
concil_notatt_set = set([]) #理事回执不参会名单
concil_notans_set = set([]) #理事未回执名单
for each in concil_set:
if each in ans_attend_set:
concil_attend_set.add(each)
elif each in ans_notatt_set:
concil_notatt_set.add(each)
else:
concil_notans_set.add(each)
#3. 显示结果
def disp(ss, cap, num = True):
#ss: 名单集合
#cap: 开头描述
print(cap,'({})'.format(len(ss)))
for i in range(np.ceil(len(ss)/5).astype(int)):
pre = i * 5
nex = (i+1) * 5
#调整显示格式
dd = ''
for each in list(ss)[pre:nex]: