网络编程
位置:首页>> 网络编程>> Python编程>> 详解Python如何实现Excel数据读取和写入

详解Python如何实现Excel数据读取和写入

作者:Vertira  发布时间:2023-10-29 06:46:35 

标签:Python,Excel,数据,读写

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数据读取和写入

来源:https://blog.csdn.net/Vertira/article/details/124293261

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com