前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于python读写excel表格的两三个例子

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

作者头像
python与大数据分析
发布2022-03-11 14:10:21
8740
发布2022-03-11 14:10:21
举报
文章被收录于专栏:python与大数据分析

关于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文件。

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

代码语言:javascript
复制
# 对从系统中导出来的文件按照“局数据”中的分公司进行分割
# 这些文件有一个共同的特性,都有“局数据”字段,但分公司不完全都有数据
# 举例
# 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)

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

代码语言:javascript
复制
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表格中的总数据量

代码语言:javascript
复制
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)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python与大数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档