python实战之实现excel读取、统计、写入

python实战之实现excel读取、统计、写入

背景

图像领域内的一个国内会议快要召开了,要发各种邀请邮件,之后要录入、统计邮件回复(参会还是不参会等)。如此重要的任务,老师就托付给我了。ps: 统计回复邮件的时候,能知道谁参会或谁不参会。

而我主要的任务,除了录入邮件回复,就是统计理事和普通会员的参会情况了(参会的、不参会的、没回复的)。录入邮件回复信息没办法只能人工操作,但如果统计也要人工的话,那工作量就太大了(比如在上百人的列表中搜索另外上百人在不在此列表中!!),于是就想到了用python来帮忙,花两天时间不断修改,写了6个版本。。。

摘要

  1. version_1基本实现了excel读取、统计、显示功能,但问题也有不少,像显示出来后还要自已复制、粘贴到excel表,而且set中还有nan这样的bug。
  2. version_2相比较version_1而言,此版本用set代替list,可以自动去重。
  3. version_3解决了set中出现nan的bug,而且还加入的excel写入的功能,但一次只能写入一张表,所以要运行两次才能写入两张表(sheet)。
  4. version_4的改进在于将version_3中写入两张表格的操作,集成在一个程序里,只需要运行一次便可写入两张表,但也总是会写入两张表,万一你只想写入一张表呢??
  5. version_5相对之前版本的最大改进在于将程序模块化,更具可读性了; 对修复set中出现nan的方法也进行了改进和简化; 而且可以自由控制写入多少张表了。
  6. 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]:
            
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值