通过Python读取excel对文件进行分类
(第一次写博客,格式不好看,见谅)
在学生工作过程中,遇到了这样一个问题:
有一个Excel,里面有项目作者的各种信息,Excel有不同的sheet,每个sheet都是一类,比如能源化工、数理、机械控制。另外还有从邮箱中下载的附件,数目很多。
如何才能利用我们学过的代码来解决呢?
首先,讲述一下代码思路
1、将python文件放在和附件、excel文件相同的目录下
2、确保压缩包的命名字符包含excel中的,比如,excel中是"基于balabala的balabala",那么压缩包至少要完全包含它,可以是"基于balabala的balabala_姓名_学号"等等
3、用一个函数读取并存储所有附件(我需要的是压缩包文件)
4、打开excel文件,读取所有数据data[i][j][k]表示第 i 个sheet的第 j 行的第 k 列元素
5、通过循环去判断目标文件在哪一类
思路很简单,接下来看看代码吧
# -*- coding: utf-8 -*-
"""
Created on Fri May 21 20:46:18 2021
@author: 晨旸熹微
"""
import os
import pandas as pd
import numpy as np
import xlrd
import os
import shutil # 用于移动复制文件
def create_dir(path):
'''
若不存在则创建一个文件夹,path是文件夹路径,只有名称的话仅在当前路径创建\n
'''
if not os.path.exists(path):
os.mkdir(path)
def Get_fname(suffix):
'''
通过文件后缀名获得需要分类的附件\n
suffix 文件后缀名,字符串格式,是一个列表\n
'''
name = []
for root, dirs,files in os.walk(".",topdown = False): # .表示在当前文件夹
for file in files :
i = os.path.join(root,file)
suff=i.split('.')[-1] # 获得文件的后缀名
if [True for i in suffix if suff in i]: # 仅将后缀满足suffix的路径保存
name.append(i[2:]) # 从2开始是因为前面有\\
return name
def Get_goal(excel_path,sheets,skip=1):
'''
获取excel文件的内容
excel_path excel的文件名,需要在同一文件夹\n
sheets 是excel的sheets数\n
skip 第0行是表头,跳过\n
'''
data = [[] for i in range(sheets)]
wb = xlrd.open_workbook(excel_path)
for i,sheet in enumerate(wb.sheets()):
[data[i].append(sheet.row_values(rownum)) for rownum in range(skip,sheet.nrows)]
return data
def Get_result(data,file_name,F_name):
'''
data -- 读取的excel数据\n
file_name -- 需要分类的文件名\n
F_name -- 最后分类的名称(文件夹名称)\n
'''
result = [[] for i in range(len(F_name))] # 每个列表就是一类的名字
[create_dir(i) for i in F_name]
num = 0 # 记录共分类了多少文件
for i in range(len(data)):
for j in range(len(data[i])):
for k in file_name:
if(data[i][j][1] in k):
result[i].append(k)
aa,bb=k.split(".")
oldname= u"C:\\Users\\23787\\Desktop\\分类文件\\"+aa+"."+bb
newname=u"C:\\Users\\23787\\Desktop\\分类文件\\"+F_name[i]+"\\"+aa+"."+bb
shutil.copyfile(oldname,newname)
num +=1
return result,num
if __name__=="__main__":
excel_path = "C:\\Users\\23787\\Desktop\\分类文件\\xxxx.xlsx"
# 写上excel的路径,注意需要两个\\才能表示一个\
data = Get_goal(excel_path,5,1)
# data[i][j][1]是第i个表格第j行的第一列,我的文件中是目标文件名
suffix=['rar','zip'] # 要分类的文件后缀名
F_name = ["机械控制","信息技术","能源化工","数理","生命科学"] # 分类的类别
rar_name = Get_fname(suffix)
result ,num= Get_result(data,rar_name,F_name)
# [print(result[i]) for i in range(len(result))]
# 用于分类打印结果,若文件过多则注释,防止用时过长
print(f"共有文件{len(rar_name)}个")
print(f"总共分类了{num}个文件")