Python读取EXLCEL名单与路径下的文件名匹配

近期需要收小组作业,人数40个左右,一个个查速度慢,写个Python脚本吧
如果你也用同样的需求,那就对了,我的脚本简单,欢迎改进分享哟~

依赖库的介绍


openpyxl: 用于Excel操作

excel_ob = openpyxl.load_workbook(path)
#openpyxl.load_workbook()方法,用于载入路径下的Excel文件,path为路径,类型为字符串

sheet_data = excel_ob.get_sheet_by_name(sheet)
#.get_sheet_by_name(sheet)方法,用于获取Excel中的数据表

result.append(sheet_data[add_value].value)
#sheet_data['单元格名'].value属性获取单元格的值,add_value是一个字符串类似于'B2'

os: 用于读取文件夹下的文件

reallydir = os.path.exists(path)
#os.path.exists(path)用于检测文件路径是否存在

os.listdir(path)
#用于读取路径下的所有文件并返回一个列表

看吧,核心就是上面提到的 \(^U^ )\

源码

import openpyxl
import os

#读取文件方法,先接受path路径(str类型),sheet表名(str类型),单元格范围是一个列表
#使用openpyxl.load_workbook(path)载入path下的文件,由excel_ob指向
#使用excel_ob.get_sheet_by_name(sheet)载入表
#新建返回列表,通过遍历取出每个单元格
#向列表中加入单元格的值,然后把单元格内容作为列表返回
#思路就是将单元格内容转换成列表,然后将路径下的文件转换成列表,然后比较两个列表
def read_excel(path:str,sheet:str,area:list) -> list:
    try:
        excel_ob = openpyxl.load_workbook(path)
        sheet_data = excel_ob.get_sheet_by_name(sheet)
    except:
        print("表名称错误,请重新执行此程序!")
    result = []
    for add_value in area:
        result.append(sheet_data[add_value].value)
    return result

#接受一个path路径(str类型)
#使用os.path.exists(path)判断路径是否存在,不存在就退出
#存在就使用os.listdir方法以路径的形式返回路径下的内容
def read_files(path:str) -> list:
    reallydir = os.path.exists(path)
    if reallydir is False:
        print("您输入的目录不存在!")
        exit()
    dir_list = os.listdir(path)
    return dir_list
    
#此方法用于去除文件的后缀名
#接受到read_files返回的文件列表,然后通过字符串的split将其分成两部分
#然后用result把第二部分载入
def only_name(name_list:list) -> list:
    result = []
    for eachone in name_list:
        result.append(eachone.split('.',2)[0])
    return result

#此方法用于比较两个列表不同的部分,用于查看谁没有交文件给我
#接受两个表一个来自Excel,一个来自路径下的文件名
#some是文件表它比较少,all是Excel表比较多
#如果路径下存在Excel表中的名字,就从总表中删除它
#最后返回总表
def diff_data(some:list,all:list) -> list:
    for eachone in some:
        if eachone in all:
            all.remove(eachone)
    return all

#此方法用于接受用户输入的单元格范围(str类型),将其转换成列表,给read_excel使用
#首先用字符串的split把字符串,分成两部分A1:B40-> 'A1','B40'
#然后对比两个字符串的开头字母是否相同,如果不相同就转换成两列表
#相同就好办,用第一个字符串的数字部分转换为整形和第二个字符串数字部分转换为整形放入range中
#for 遍历,然后与转换为字符串与字符串结合
#不相同也好办,迭代自身方法,将第一个字符开头结合第二个字符的数字部分代入
#不相同,第二个字符也是将第一个字符开头数字部分结合代入
def areas(begin:str) -> list:
    try:
        result = []
        begin = begin.split(':',2)
        over = begin[1]
        begin = begin[0]
        if begin[0] == over[0]:
            for one in range(int(begin[1]),int(over[1:])+1):
                result.append(begin[0]+str(one))
            return result
        else:
            result.extend(areas(begin+':'+begin[0]+over[1:]))
            sparate.append(len(result))
            result.extend(areas(over[0]+begin[1]+':'+over))
            return result
    except:
        print("输入范围错误,请重新运行此程序!")
        exit()

sparate = []

def main():
    dir_list = []
    area = areas(input("请输入您表的开始位置和结束位置(以冒号隔开): "))
    path = input('请输入您表的路径: ')
    sheet = input('请输入您的表名: ')
    name_list = read_excel(path,sheet,area)
    if sparate != []:
        number = name_list[:sparate[0]] #备用于其他作用
        name_list = name_list[sparate[0]:]
    dir_list = only_name(read_files('./dirs'))
    someone = diff_data(dir_list,name_list)
    for eachone in someone:
        print(eachone)

if __name__ == "__main__":
    main()

用法

  1. 输入: 单元格的范围(目前只支持一列,多列也是可以的,但需要你开发哟~)
  2. 输入Excle

Python查看谁没有交文件给我_字符串