女朋友上午给我说,昨天本来打算准时下班,结果因为在办公室查询和处理数据速度太慢,一天才完成了几个表格,要是搞不定的话,今天还要加班。
办公室里的老司机们处理起来比较熟练,双屏、三屏电脑或者用函数什么的处理的挺快的。
之前倒是教女朋友用过vlookup函数来查询,但是她感觉太复杂了,只好用python帮她减轻点工作压力吧。
女朋友工作任务主要是查询配件的价格。
每个配件大概有10-15个供应商,每个供应商在每个报价周期中价格是不一定相同的,比方说九月报价100元,十月报价110元等,并且有的供应商在一个表格中有不同的工作簿,查找起来很麻烦,用vlookup函数不是很方便。
现在的操作方法基本上是,记住《配件清单》里面的配件名字,复制一下,然后打开各个供应商的《报价表》,在报价表里找到这个配件名字,然后把各个报价周期中的价格给找到,重新建立一个表格,把这些信息给复制进去就可以了。
老司机一般就用双屏来同时查找,速度会相对快一点,但是这个速度在自动查询上还是渣渣。
中午吃饭的时候大致想了一下,程序操作逻辑:
1.读取文件获得所有“配件名字”;
2.批量读取供应商《报价表》
3.在各个供应商《报价表》中依次搜索“配件名字”,搜索各个报价表中的工作簿的所有信息;
4.根据“配件名字”确定所在的行;
5.根据“配件名字”所在行,读取该行所有信息,即各周期报价
6.将读取到的各个周期报价给进行保存,保存所在位置及文件。
代码如下:
import pandas as pd
import os
import easygui as g
import xlrd
path = g.fileopenbox(msg="选择文件", title="选择要查询的文件清单", default='*', filetypes=None)
data = xlrd.open_workbook(path, encoding_override='utf-8') #打开文件(文件路径)
table = data.sheets()[0] # 选定表 #第一个工作簿
nrows = table.nrows # 获取行号
ncols = table.ncols # 获取列号
names = [] #空列表存储
for i in range(1, nrows): # 第0行为表头
alldata = table.row_values(i) # 循环输出excel表中每一行,即所有数据
name = alldata[0] # 取出表中第二列数据
names.append(name)
print('要查询的信息如下:')
print(names)
def listdir(path, path_name): # 定义传入存储文件的list函数
for file in os.listdir(path): #依次获得返回指定的文件夹包含的文件或文件夹的名字的列表
file_path = os.path.join(path, file) #将多个路径组合后返回
if os.path.isdir(file_path): #返回一个列表,其中包含有指定路径下的目录和文件的名称
listdir(file_path, path_name)
else:
path_name.append(file_path) #加入到路径列表中
path_name = []
path = g.diropenbox(msg="请选择文件夹", title="选择要查询的文件夹")
listdir(path,path_name)
for path in path_name:
file = os.path.split(path) #拆分分隔符
file_name = file[1]
try:
data = pd.read_excel(path,None) #读取待查询的excel文件数据,设置None可以生成一个字典,字典中的key值即为sheet名字
sheet_names = [] #用一个空列表, 准备存储sheet的名字
for sh_name in data.keys(): #依次便利data.key()中的名字
# print(sh_name)
sheet_names.append(sh_name) #将sheet名字存储进入列表sheet_names
for sheet_name in sheet_names: #依次循环获得工作簿
workbook = pd.read_excel(path, sheet_name=sheet_name) # 文件路径和sheet名字
# print(workbook)
for indexs in workbook.index: # 用.index进行依次查找
for i in range(len(workbook.loc[indexs].values)): # 依次生成
for name in names: #依次循环
if (workbook.loc[indexs].values[i] == name): #如果查找到该关键词
print("*" * 50)
print("[" + name + "]的位置在" + path + " 的" + sheet_name + " 工作簿中") #显示位置
print('行数:', indexs + 1, '列数:', i + 1) #行数和列数,从0开始,要加1
print("*" * 50)
data = pd.DataFrame(pd.read_excel(path,sheet_name=sheet_name)) # 读取数据,设置None可以生成一个字典,字典中的key值即为sheet名字,此时不用使用DataFram,会报错
counts = data.loc[indexs]
print("[" + name + "]所在行数据如下:")
print(counts) # 获取行名为0这一行的内容
df = pd.DataFrame(counts)
print(df)
file_save_name ='[' + name + ']-在文件[' + file_name + ']中的['+ sheet_name +']工作簿中的行数据' #关键词所在位置
with open(name + '.txt', 'a+',encoding='utf-8') as f: # 用w格式新建文件,并且用file_name命名,再加上“.txt”后缀,文字编码格式'utf-8'
f.write(file_save_name + '\n') # 将文件位置写入到文本
f.close() # 将文件关闭保存
df.to_excel(file_save_name + ".xlsx") #写入文件
except Exception as e:
print(e)
pass
print("自动查询和生成完毕")
在这里还是要推荐下我自己建的Python开发学习群:1156465813,群里都是学Python开发的,如果你正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2020最新的Python进阶资料和高级开发教程,欢迎进阶中和进想深入Python的小伙伴!