Python 处理excel

老师需要找出哪些同学在网上填了返校申请,因为有几百个人,所以比较难以肉眼看出来

这里我们假设填了信息的人可以导出名字,和整个年级的名单

这样我们就有两个表了,代码如下

import xlrd

# 总的人名
name_set = []
# 填报的人
name_data = []
# 没填报的人
other = []
set_excel = xlrd.open_workbook('C:\\Users\\Luokey\\Desktop\\set.xlsx')
set_sheet = set_excel.sheets()[0]
print(set_sheet.name)

print("=============")
# 这里实际上是从第二行开始,到第一列的最后一个元素
for i in range(1,len(set_sheet.col_slice(0, start_rowx=0, end_rowx=None))):
    name = set_sheet.cell_value(i, 0)
    name_set.append(name)
print(name_set)
print(len(name_set))

data_excel = xlrd.open_workbook('C:\\Users\\Luokey\\Desktop\\data.xlsx')
data_sheet = data_excel.sheets()[0]

print("=============")
# 这里实际上是从第二行开始,到第一列的最后一个元素
for i in range(1,len(data_sheet.col_slice(0, start_rowx=0, end_rowx=None))):
    name = data_sheet.cell_value(i, 0)
    name_data.append(name)

print("======没提交的名单=======")
for name in name_set:
    if name not in name_data:
        print(name)
        other.append(name)

print("一共:"+str(len(other))+"位同学")
print("========================")

代码非常简单,分成三部分

  1. 初始化list
  2. 读表格中的名字,并存入list
  3. 对比list中的名字,没有的就输出
# 可以获得某一列的长度
len(.col_slice(列的索引, start_rowx=0, end_rowx=None))

遇到的问题

xlrd.biffh.XLRDError: Excel xlsx file; not supported

在xlrd-2.0.1中已经不支持xlsx这种格式了,因此只能重新安装老版本的xlrd
在cmd中输入命令

pip uninstall xlrd
pip install xlrd==1.2.0

下载指定版本的xlrd即可

写入excel

除此之外遇到一个需求是,根据excel的内容去修改excel,而xlrd只能读excel,而不能写,因此需要另外的模块

import xlwt

代码如下:

from bs4 import BeautifulSoup
import xlrd
import xlwt
from xlutils.copy import copy

with open('C:\\Users\\Luokey\\Desktop\\1.htm',encoding="utf-8") as file_obj:
    html = file_obj.read()
soup = BeautifulSoup(html,'lxml')
names = []
items = soup.select('.manage-bar.completed > .manage-body > .left-block > .apply-detail-outside > ul:nth-child(3) > li:nth-child(1)')
for item in items:
    name = item.text[6:]
    names.append(name)

info=[]
old = xlrd.open_workbook('C:\\Users\\Luokey\\Desktop\\18.xlsx')
old_sheet = old.sheets()[0]
new_excel = copy(old)
sheet1 = new_excel.get_sheet(0)
print("=============")
for i in range(1,len(old_sheet.col_slice(1, start_rowx=0, end_rowx=None))):
    na = old_sheet.cell_value(i, 1)
    if na in names:
        info.append(i)
for i in range(1,len(old_sheet.col_slice(1, start_rowx=0, end_rowx=None))):
    sheet1.write(i,2,1)
for i in info:
    sheet1.write(i,2,0)
new_excel.save('18.xls') 

因为那个网页一次性可以显示上千条数据,所以就不写登录爬虫,直接把整个网页保存下来读取内容

  1. 先用xlrd读取表
  2. 用copy复制一份表
  3. 操作新表
  4. 保存新表