关于flask的事情遇到一些麻烦,暂时先搁置几天;最近工作总是在处理数据,出于偷懒的因素,最反感重复性的工作,因此当几十个上百个表哥表姐摆在面前的时候,也不太想麻烦别人,总想着用批处理的方式来解决,这不就遇到了一些问题嘛。

1、上百个excel,都有同样的列名,比如局名称、局编码和序号以及其他列

2、要将这上百个文件按照局名称拆分成不同的文件

3、按照这些局名称统计数据量

4、统计表格中的总数据量,乍看起来,4和3是一样的,其实不然,2和3是一次任务,表格是xlsx格式;4是单独的,表格是1997-2013版的xls。

python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。安装xlrd的时候,当时不能上网,有些乱,先下载的是xlrd3,xlrd3可以处理xlsx文件,xlrd1.2.0可以处理xls文件。

关于python读写excel表格的两三个例子_文件名

任务一、将表格按相应字段内容拆分成多个表格

# 对从系统中导出来的文件按照“局数据”中的分公司进行分割# 这些文件有一个共同的特性,都有“局数据”字段,但分公司不完全都有数据# 举例# xxx.xlsx  ->xxx_广州分公司.xlsx,xxx_上海分公司.xlsx# yyy.xlsx  ->yyy_广州分公司.xlsx,yyy_武汉分公司.xlsx# zzz.xlax  ->zzz_广州分公司.xlsx,zzz_上海分公司.xlsx,yyy_武汉分公司.xlsx,yyy_天津分公司.xlsx# 因为在内网的原因,安装python的package不太方便,所以大致再网上查了一下excel的用法和差异# 知道 openpyxl 和 xlutils、xlrd、xlwt可用,openpyxl相对比较方便一些,可以直接读写,而后者比较啰嗦# 委托同事下载了一下whl文件本地安装,没想到openpyxl、xlutils无法安装成功# 只好硬着头皮用xlrd、xlwt了# xlrd用来读取excel,这个读操作还算比较方便# xlwt用来写入excel,这个写操作未免有点低级,一个单元格一个单元格的进行操作,效率未免有点太低了# 无论如何,还是成功了import xlwt
import xlrd3
import os

# 获取待转换文件的文件夹路径curpath = os.path.abspath('.') + '\\doc\\'# 获取当前文件夹下的文件列表allfile = os.listdir(curpath)
for filename in allfile:
# 拼接路径及文件 pathfilename = curpath + filename
# 如果当前为文件夹对象,则跳过 if os.path.isdir(pathfilename):
continue # 打开当前excel文件 xlsfile = xlrd3.open_workbook(pathfilename)
# 获取要打开的sheet名称 sheet_name = xlsfile.sheet_names()[0]
# 获取要打开的sheet对象 sheet = xlsfile.sheet_by_name(sheet_name)
# 获取sheet中的表格行数列数 xlsnrows, xlsncols = sheet.nrows, sheet.ncols
orgnamecol = 0 # 暂存当前要分割依据“局名称”所在的列 xlsdatalist = [] # 暂存当前excel表的数据 sheettitle = [] # 暂储当前excel表的表头 # 根据excel的总行数开始遍历 for i in range(xlsnrows):
# 首行为标题,特殊处理,存到sheettitle if i == 0:
sheettitle = sheet.row_values(0) # 标题存到sheettitle orgnamecol = sheettitle.index('局名称') # 查找分割数据依据的所在列的位置 else:
data = sheet.row_values(i) # 获取当前行信息 orgname = sheet.cell_value(i, orgnamecol) # 基于单元格位置,获取当前的局名称 xlsdata = [orgname, data] # 将当前局名称和当前数据组装成一个列表 xlsdatalist.append(xlsdata) # 写入xlsdatalist # 获取分割依据-局名称有多少,作为生成excel表的基础 orglist = list(set([i[0] for i in xlsdatalist]))
# 分隔当前的文件名和后缀名,并取文件名 filesegname = filename.split('.')[0]
# 每遍历一次局名称,则生成一个excel文件 for orgname in orglist:
# 拼接文件名 xlswritefile = curpath + filesegname + '_' + orgname + '.xlsx' # 初始化Workbook写对象 workbook = xlwt.Workbook(encoding='utl-8', style_compression=0)
# 增加一个sheet写入页 worksheet = workbook.add_sheet('sheet', cell_overwrite_ok=True)
# 构造表的标题 for i, title in enumerate(sheettitle):
worksheet.write(0, i, title)
row = 1 # 遍历xlsdatalist # 需要注意的row和col的自增的条件 for rowdata in xlsdatalist:
# 判断当前列表是否等于该局数据 if rowdata[0] == orgname:
col = 0 # 读取当前行数据 for data in rowdata[1]:
if data:
worksheet.write(row, col, data) # 基于行列位置,开始写入数据 col += 1 row += 1 workbook.save(xlswritefile)


任务二、将表格按相应字段内容统计其数据量

import xlwt
import os
import pandas as pd

# 获取待转换文件的文件夹路径curpath = os.path.abspath('.') + '\\doc\\'# 获取当前文件夹下的文件列表allfile = os.listdir(curpath)
for filename in allfile:
# 拼接路径及文件 pathfilename = curpath + filename
# 如果当前为文件夹对象,则跳过 if os.path.isdir(pathfilename):
continue # xlrd要安装1.2.0版本,最新版的不支持xls文件 # 透视表 df = pd.read_excel(pathfilename) # 这个会直接默认读取到这个Excel的第一个表单 data = df.head() # 默认读取前5行的数据 pivotdf = pd.pivot_table(df, index='局名称', values='序号', aggfunc='count')
print(pivotdf)

# 交叉表 # 必须指定列名 crossdf = pd.crosstab(index=df['局名称'], columns=df['局编码'], values=df['序号'], aggfunc='count')
print(crossdf)

# 分组统计 groupbydf = data.groupby(['局名称'])['序号'].count()
print(groupbydf)


任务三、统计老版excel表格中的总数据量

import xlrd3
import os
# 获取待转换文件的文件夹路径curpath = os.path.abspath('.') + '\\doc2\\'# 获取当前文件夹下的文件列表allfile = os.listdir(curpath)
for filename in allfile:
# 拼接路径及文件 pathfilename = curpath + filename
# 如果当前为文件夹对象,则跳过 if os.path.isdir(pathfilename):
continue # 打开当前excel文件 sheetrows=0 xlsfile = xlrd3.open_workbook(pathfilename)
# 获取要打开的sheet名称 for sheet_name in xlsfile.sheet_names():
if sheet_name.find("SQL Results") == - 1:
continue else:
# 获取要打开的sheet对象 sheet = xlsfile.sheet_by_name(sheet_name)
# 获取sheet中的表格行数列数 xlsnrows, xlsncols = sheet.nrows, sheet.ncols
# 去掉标题,循环累加 sheetrows = sheetrows + xlsnrows -1 print(filename,sheetrows)



关于python读写excel表格的两三个例子_d3_02