Python读取和写入Excel数据


Posted in Python onApril 20, 2022

1. 功能分析

1.加载文件夹内所有的Excel数据;

2.生产贡献度分析图表(以柱状图显示表格数据);

3.提起Excel表格中指定列数据;

4.定向筛选所需数据;

5.多表数据统计排行;

6.多表数据合并新excel文件。

2.系统开发环境

Anaconda3,在conda 中,window和ubuntu中的python功能一样 。

pycharm。

3.安装依赖库

Python读取和写入Excel数据

这些依赖包   都要装好

import os
import xlrd2 #xlrd: 对Excel进行读相关操作
import xlwt #xlwt: 对Excel进行写相关操作,且只能创建一个全新的Excel然后进行写入和保存。
import numpy
import matplotlib
from prettytable import PrettyTable  #PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格
from matplotlib import pyplot as plt

4. 主函数设计

Excel数据分析师的主函数main(),主要用于实现系统的主界面。在主函数main()中,首先调用get_files_name()函数获取文件名。

get_files_name()函数代码如下:

#导入文件
def get_files_name():
    """
    用于获取文件名
    :return: 返回值为文件名组成的列表
    """
    file_list = os.listdir('./data')
    return file_list

然后调用load_data()函数来读取excel文件并字典方式保存。

#保存生产excel表
def load_data(file_list):
    """
    用于读取指定的文件并保存至字典数据结构中
    :param file_list: 需要加载的文件列表
    :return: 保存了文件内容的字典
    """
    dictory = {}
    for file in file_list:
        # 获取表格文件
        book = xlrd2.open_workbook('./data/'+file)
        # 获取表格中的所有sheet
        names = book.sheet_names()
        # 获取第一个sheet
        sheet = book.sheet_by_index(0)
        # 获取当前表格的行数
        rows = sheet.nrows
        # 获取当前表格的列数
        cols = sheet.ncols
        # 获取表头文件,即表格第一行
        head = sheet.row_values(0)
        for row in range(rows-1):
            # 如果当前字典中没有该城市则创建一个
            if not sheet.cell_value(row+1, 0) in dictory.keys():
                dictory[sheet.cell_value(row+1, 0)] = {}
            for col in range(cols-1):
                dictory[sheet.cell_value(row+1, 0)][head[col+1]] = float(sheet.cell_value(row+1, col+1))
    return dictory

接着调用menu()函数生成功能选择菜单。

menu()函数代码如下: 

# 打印菜单
def menu():
    print("  ----------Excel 数据分析师----------")
    print("{:<30}".format("  ==============功能菜单============== "))
    print("{:<30}".format("   1. 显示当前数据                     "))
    print("{:<30}".format("   2. 以柱状图展示当前数据              "))
    print("{:<30}".format("   3. 提起指定列                       "))
    print("{:<30}".format("   4. 定向筛选指定元素                       "))
    print("{:<30}".format("   5. 数据排行                         "))
    print("{:<30}".format("   6. 重新加载数据                      "))
    print("{:<30}".format("   7. 保存当前数据                      "))
    print("{:<30}".format("   0. 退出程序                          "))
    print("{:<30}".format(" ==================================== "))
    print("{:<30}".format(" 说明:输入相应数字后按下回车选择指定功能 "))
    print('\n')

并且应用if语句控制各个子函数的调用,从而实现对Excel文件的选择,Excel数据的加载,选择、筛选、合并、排序和统计等功能。

主函数完整代码如下:

if __name__ == "__main__":
    # 导入文件
    files = get_files_name()
    data = {}
    print("当前data文件夹下的文件如下:")
    num = 1
    for file in files:
        print(num, file)
        num += 1
    while(1):
        index_str = input("请选择需要导入的文件序号(多个文件导入时用空格分开, 输入0则导入所有文件,输入多文件则自动合并):")
        index_list = index_str.split(' ')
        try:
            index_list.remove('')
        except:
            pass
        choice_file_list = []
        if index_list[0] == '0':
            choice_file_list = files
            break
        else:
            try:
                for item in index_list:
                    choice_file_list.append(files[int(item)-1])
            except:
                print("输入序号有误")
                continue
        if choice_file_list:
            break
        else:
            print("输入序号有误")
    data = load_data(choice_file_list)
    print("导入数据成功\n")
    # 调用函数,打印菜单
    menu()
    while 1:
        choice = input("请选择指定功能:")
        if choice == '0':
            print("\n退出程序\n")
            exit()
        elif choice == '1':
            print("当前功能:显示当前数据")
            show_data(data)
            input('\n按下回车返回菜单')
            menu()
        elif choice == '2':
            print("当前功能:以柱状图显示数据")
            draw_plot(data)
            input('\n按下回车返回菜单')
            menu()
        elif choice == '3':
            print("当前功能:筛选指定列")
            keys = list(data[list(data.keys())[0]].keys())
            print("当前表格中的列如下:")
            num = 1
            for key in keys:
                print(num, key)
                num += 1
            choice_col_list = []
            while (1):
                index_str = input("请选择需要筛选出的列序号(多列之间用空格分开,0代表所有列):")
                index_list = index_str.split(' ')
                try:
                    index_list.remove('')
                except:
                    pass
                choice_file_list = []
                if index_list[0] == '0':
                    choice_col_list = keys
                    break
                else:
                    try:
                        for item in index_list:
                            choice_col_list.append(keys[int(item) - 1])
                    except:
                        print("输入序号有误")
                        continue
                if choice_col_list:
                    break
                else:
                    print("输入序号有误")
            data = get_specified_cols(data, choice_col_list)
            print("筛选成功")
            input('\n按下回车返回菜单')
            menu()
        elif choice == '4':
            print("当前功能:筛选指定行")
            keys = list(data[list(data.keys())[0]].keys())
            print("当前表格中的列如下:")
            num = 1
            print(num, "城市")
            num += 1
            for key in keys:
                print(num, key)
                num += 1
            col = int(input("请输入需要进行筛选的数据所在的列:"))-2
            if col == -1:
                col = '城市'
            else:
                col = keys[col]
            op_list = ['<', '<=', '=', '>=', '>']
            print("比较操作符如下:")
            num = 1
            for op in op_list:
                print(num, op)
                num += 1
            operation = int(input("请输入比较操作符前的序号:"))-1
            operation = op_list[operation]
            value = input("请输入需要筛选的值:")
            data = get_specified_data(data, operation, col, value)
            print("筛选成功")
            input('\n按下回车返回菜单')
            menu()
        elif choice == '5':
            print("当前功能:数据排序")
            keys = list(data[list(data.keys())[0]].keys())
            print("当前表格中的列如下:")
            num = 1
            for key in keys:
                print(num, key) #显示当前表格中的所有的列
                num += 1
            col = int(input("请输入需要进行排序的数据所在的列:")) - 1
            col = keys[col]
            reverse = input("排序方式:\n1 从大到小排序\n2 从小到大排序\n")
            if reverse == '1':
                data = sort_data(data, col, True)
            elif reverse == '2':
                data = sort_data(data, col, False)
            else:
                print("输入有误")
            input('\n按下回车返回菜单')
            menu()
        elif choice == '6':
            # 导入文件
            files = get_files_name()
            data = {}
            print("当前文件夹下的文件如下:")
            num = 1
            for file in files:
                print(num, file)
                num += 1
            while (1):
                index_str = input("请选择需要导入的文件序号(多个文件导入时用空格分开, 输入0则导入所有文件,输入多文件则自动合并):")
                index_list = index_str.split(' ')
                try:
                    index_list.remove('')
                except:
                    pass
                choice_file_list = []
                if index_list[0] == '0':
                    choice_file_list = files
                    break
                else:
                    try:
                        for item in index_list:
                            choice_file_list.append(files[int(item) - 1])
                    except:
                        print("输入序号有误")
                        continue
                if choice_file_list:
                    break
                else:
                    print("输入序号有误")
            data = load_data(choice_file_list)
            print("导入数据成功\n")
            # 打印菜单
            menu()
        elif choice == '7':
            print("当前功能:保存数据")
            save(data)
            input('\n按下回车返回菜单')
            menu()
        else:
            print("请输入正确的数字")
            input('\n按下回车返回菜单')
            menu()

5.模块设计

加载文件夹内所有的Excel数据

show_data()函数通过PrettyTable 库(PrettyTable 库是python中的一个第三方库,可用来生成美观的ASCII格式的表格)将之前保存的字典数据生成表格。

#加载显示数据
def show_data(dictory):
    try:
        keys = list(dictory[list(dictory.keys())[0]].keys())
    except:
        print("当前数据为空")
        return
    head = ['城市']
    head.extend(keys)
    table = PrettyTable(head)
    for key in dictory.keys():
        line = [key]
        for key_2 in keys:
            line.append(dictory[key][key_2])
        table.add_row(line)
    print(table)

效果图如下:

Python读取和写入Excel数据

生产贡献度分析图表(以柱状图显示表格数据)

draw_plot( )函数使用了matplotlib库。通过atplotlib.rc( )来设置字体,通过plt.bar( )函数来绘制柱状图,通过plt.legend( )函数来给图添加图例。

#制作图表
def draw_plot(dictory):
    font = {'family': 'MicroSoft Yahei', 'weight': 'bold', 'size': 7}
    matplotlib.rc('font', **font) #设置中文字体
    # 定义三个颜色
    index = numpy.arange(len(dictory.keys()))
    color = [(256 / 256, 0 / 256, 0 / 256, 1),
            (0 / 256, 0 / 256, 256 / 256, 1),
            (0 / 256, 256 / 256, 0 / 256, 1),
            (0 / 256, 0 / 256, 0 / 256, 1)]
    first_key = list(dictory.keys())
    first_key = first_key[0]
    cols = list(dictory[first_key].keys())
    data = []
    for i in range(len(cols)):
        data.append([])
    for key in dictory.keys():
        for col in range(len(cols)):
            data[col].append(dictory[key][cols[col]])
    offset = -1/4
    for i in range(len(cols)):
        plt.bar(index+offset, data[i], color=color[i], width=1 / 5) #通过bar函数可以用柱状图来表达一些变量的统计分布
        offset += 1/4
    plt.xticks(index, dictory.keys())#表示刻度
    plt.legend(cols)#给图像加上图例
    plt.show()

效果图 

Python读取和写入Excel数据

提起Excel表格中指定列数据

get_specified_cols()函数根据用户在菜单输入的列名,通过字典的索引筛选出列名,加载指定列的所有数据。

#提起指定列
def get_specified_cols(dictory, col_name_list):
    """
    筛选出指定的列
    :param dictory:原始字典
    :param col_name_list: 需要筛选出的列名,城市名默认出现
    :return: 筛选之后的字典
    """
    new_dict = {}
    for key in dictory.keys():
        new_dict[key] = {}
        for col_name in col_name_list:
            new_dict[key][col_name] = dictory[key][col_name]
    return new_dict

效果图如下:

Python读取和写入Excel数据

到此这篇关于详解Python如何实现Excel数据读取和写入的文章就介绍到这了!

Python 相关文章推荐
浅析python递归函数和河内塔问题
Apr 18 Python
Python2.X/Python3.X中urllib库区别讲解
Dec 19 Python
分享Pycharm中一些不为人知的技巧
Apr 03 Python
python excel使用xlutils类库实现追加写功能的方法
May 02 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
python hough变换检测直线的实现方法
Jul 12 Python
python使用Geany编辑器配置方法
Feb 21 Python
pycharm解决关闭flask后依旧可以访问服务的问题
Apr 03 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 Python
实例详解Python的进程,线程和协程
Mar 13 Python
Python 的演示平台支持 WSGI 接口的应用
Apr 20 #Python
python​格式化字符串
Apr 20 #Python
Python编写冷笑话生成器
Apr 20 #Python
Python Django / Flask如何使用Elasticsearch
Apr 19 #Python
python中mongodb包操作数据库
Apr 19 #Python
Elasticsearch 聚合查询和排序
Apr 19 #Python
Elasticsearch 基本查询和组合查询
Apr 19 #Python
You might like
2020年4月放送决定!第2期TV动画《邪神酱飞踢》视觉图&主题曲情报公开!
2020/03/06 日漫
php中simplexml_load_file函数用法实例
2014/11/12 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
JavaScript获取多个数组的交集简单实例
2013/11/11 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
nodejs redis 发布订阅机制封装实现方法及实例代码
2016/12/15 NodeJs
vue多种弹框的弹出形式的示例代码
2017/09/18 Javascript
opencv 识别微信登录验证滑动块位置
2018/08/07 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python help()函数用法详解
2014/03/11 Python
Python利用ElementTree模块处理XML的方法详解
2017/08/31 Python
Python File readlines() 使用方法
2018/03/19 Python
python多线程同步实例教程
2019/08/11 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
html2canvas生成清晰的图片实现打印的示例代码
2019/09/30 HTML / CSS
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
大学生收银员求职信分享
2014/01/02 职场文书
年度考核自我鉴定
2014/02/02 职场文书
群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
化工生产实习心得体会
2016/01/22 职场文书
nginx搭建图片服务器的过程详解(root和alias的区别)
2021/03/31 Servers