当前位置:   article > 正文

利用Python对Excel数据进行处理_python处理excel

python处理excel

通过本文,记录分享我利用Python对已存在的excel表格进行数据处理。

因为是没学可视化之前做的,所以都展示在后台上。

1. 功能分析

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

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

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

1.4定向筛选所需数据;

1.5多表数据统计排行;

1.6多表数据合并新excel文件。

2. 系统开发必备

2.1 系统开发环境

本系统的软件开发及运行环境具体如下:

  • 操作系统:Windows7、Windows10;
  • Python版本:Python3.9
  • 开发工具:Pycharm

2.2 文件夹组织结构

3.导库

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

4. 主函数设计

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

get_files_name()函数代码如下:

  1. #导入文件
  2. def get_files_name():
  3. """
  4. 用于获取文件名
  5. :return: 返回值为文件名组成的列表
  6. """
  7. file_list = os.listdir('./data')
  8. return file_list
'
运行

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

  1. #保存生产excel表
  2. def load_data(file_list):
  3. """
  4. 用于读取指定的文件并保存至字典数据结构中
  5. :param file_list: 需要加载的文件列表
  6. :return: 保存了文件内容的字典
  7. """
  8. dictory = {}
  9. for file in file_list:
  10. # 获取表格文件
  11. book = xlrd2.open_workbook('./data/'+file)
  12. # 获取表格中的所有sheet
  13. names = book.sheet_names()
  14. # 获取第一个sheet
  15. sheet = book.sheet_by_index(0)
  16. # 获取当前表格的行数
  17. rows = sheet.nrows
  18. # 获取当前表格的列数
  19. cols = sheet.ncols
  20. # 获取表头文件,即表格第一行
  21. head = sheet.row_values(0)
  22. for row in range(rows-1):
  23. # 如果当前字典中没有该城市则创建一个
  24. if not sheet.cell_value(row+1, 0) in dictory.keys():
  25. dictory[sheet.cell_value(row+1, 0)] = {}
  26. for col in range(cols-1):
  27. dictory[sheet.cell_value(row+1, 0)][head[col+1]] = float(sheet.cell_value(row+1, col+1))
  28. return dictory
'
运行

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

menu()函数代码如下:

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

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

主函数完整代码如下:

  1. if __name__ == "__main__":
  2. # 导入文件
  3. files = get_files_name()
  4. data = {}
  5. print("当前data文件夹下的文件如下:")
  6. num = 1
  7. for file in files:
  8. print(num, file)
  9. num += 1
  10. while(1):
  11. index_str = input("请选择需要导入的文件序号(多个文件导入时用空格分开, 输入0则导入所有文件,输入多文件则自动合并):")
  12. index_list = index_str.split(' ')
  13. try:
  14. index_list.remove('')
  15. except:
  16. pass
  17. choice_file_list = []
  18. if index_list[0] == '0':
  19. choice_file_list = files
  20. break
  21. else:
  22. try:
  23. for item in index_list:
  24. choice_file_list.append(files[int(item)-1])
  25. except:
  26. print("输入序号有误")
  27. continue
  28. if choice_file_list:
  29. break
  30. else:
  31. print("输入序号有误")
  32. data = load_data(choice_file_list)
  33. print("导入数据成功\n")
  34. # 调用函数,打印菜单
  35. menu()
  36. while 1:
  37. choice = input("请选择指定功能:")
  38. if choice == '0':
  39. print("\n退出程序\n")
  40. exit()
  41. elif choice == '1':
  42. print("当前功能:显示当前数据")
  43. show_data(data)
  44. input('\n按下回车返回菜单')
  45. menu()
  46. elif choice == '2':
  47. print("当前功能:以柱状图显示数据")
  48. draw_plot(data)
  49. input('\n按下回车返回菜单')
  50. menu()
  51. elif choice == '3':
  52. print("当前功能:筛选指定列")
  53. keys = list(data[list(data.keys())[0]].keys())
  54. print("当前表格中的列如下:")
  55. num = 1
  56. for key in keys:
  57. print(num, key)
  58. num += 1
  59. choice_col_list = []
  60. while (1):
  61. index_str = input("请选择需要筛选出的列序号(多列之间用空格分开,0代表所有列):")
  62. index_list = index_str.split(' ')
  63. try:
  64. index_list.remove('')
  65. except:
  66. pass
  67. choice_file_list = []
  68. if index_list[0] == '0':
  69. choice_col_list = keys
  70. break
  71. else:
  72. try:
  73. for item in index_list:
  74. choice_col_list.append(keys[int(item) - 1])
  75. except:
  76. print("输入序号有误")
  77. continue
  78. if choice_col_list:
  79. break
  80. else:
  81. print("输入序号有误")
  82. data = get_specified_cols(data, choice_col_list)
  83. print("筛选成功")
  84. input('\n按下回车返回菜单')
  85. menu()
  86. elif choice == '4':
  87. print("当前功能:筛选指定行")
  88. keys = list(data[list(data.keys())[0]].keys())
  89. print("当前表格中的列如下:")
  90. num = 1
  91. print(num, "城市")
  92. num += 1
  93. for key in keys:
  94. print(num, key)
  95. num += 1
  96. col = int(input("请输入需要进行筛选的数据所在的列:"))-2
  97. if col == -1:
  98. col = '城市'
  99. else:
  100. col = keys[col]
  101. op_list = ['<', '<=', '=', '>=', '>']
  102. print("比较操作符如下:")
  103. num = 1
  104. for op in op_list:
  105. print(num, op)
  106. num += 1
  107. operation = int(input("请输入比较操作符前的序号:"))-1
  108. operation = op_list[operation]
  109. value = input("请输入需要筛选的值:")
  110. data = get_specified_data(data, operation, col, value)
  111. print("筛选成功")
  112. input('\n按下回车返回菜单')
  113. menu()
  114. elif choice == '5':
  115. print("当前功能:数据排序")
  116. keys = list(data[list(data.keys())[0]].keys())
  117. print("当前表格中的列如下:")
  118. num = 1
  119. for key in keys:
  120. print(num, key) #显示当前表格中的所有的列
  121. num += 1
  122. col = int(input("请输入需要进行排序的数据所在的列:")) - 1
  123. col = keys[col]
  124. reverse = input("排序方式:\n1 从大到小排序\n2 从小到大排序\n")
  125. if reverse == '1':
  126. data = sort_data(data, col, True)
  127. elif reverse == '2':
  128. data = sort_data(data, col, False)
  129. else:
  130. print("输入有误")
  131. input('\n按下回车返回菜单')
  132. menu()
  133. elif choice == '6':
  134. # 导入文件
  135. files = get_files_name()
  136. data = {}
  137. print("当前文件夹下的文件如下:")
  138. num = 1
  139. for file in files:
  140. print(num, file)
  141. num += 1
  142. while (1):
  143. index_str = input("请选择需要导入的文件序号(多个文件导入时用空格分开, 输入0则导入所有文件,输入多文件则自动合并):")
  144. index_list = index_str.split(' ')
  145. try:
  146. index_list.remove('')
  147. except:
  148. pass
  149. choice_file_list = []
  150. if index_list[0] == '0':
  151. choice_file_list = files
  152. break
  153. else:
  154. try:
  155. for item in index_list:
  156. choice_file_list.append(files[int(item) - 1])
  157. except:
  158. print("输入序号有误")
  159. continue
  160. if choice_file_list:
  161. break
  162. else:
  163. print("输入序号有误")
  164. data = load_data(choice_file_list)
  165. print("导入数据成功\n")
  166. # 打印菜单
  167. menu()
  168. elif choice == '7':
  169. print("当前功能:保存数据")
  170. save(data)
  171. input('\n按下回车返回菜单')
  172. menu()
  173. else:
  174. print("请输入正确的数字")
  175. input('\n按下回车返回菜单')
  176. menu()

5.模块设计

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

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

  1. #加载显示数据
  2. def show_data(dictory):
  3. try:
  4. keys = list(dictory[list(dictory.keys())[0]].keys())
  5. except:
  6. print("当前数据为空")
  7. return
  8. head = ['城市']
  9. head.extend(keys)
  10. table = PrettyTable(head)
  11. for key in dictory.keys():
  12. line = [key]
  13. for key_2 in keys:
  14. line.append(dictory[key][key_2])
  15. table.add_row(line)
  16. print(table)
'
运行

效果图如下:

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

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

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

效果图如下:

5.3提起Excel表格中指定列数据

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

  1. #提起指定列
  2. def get_specified_cols(dictory, col_name_list):
  3. """
  4. 筛选出指定的列
  5. :param dictory:原始字典
  6. :param col_name_list: 需要筛选出的列名,城市名默认出现
  7. :return: 筛选之后的字典
  8. """
  9. new_dict = {}
  10. for key in dictory.keys():
  11. new_dict[key] = {}
  12. for col_name in col_name_list:
  13. new_dict[key][col_name] = dictory[key][col_name]
  14. return new_dict
'
运行

效果图如下:

5.4定向筛选所需数据

get_specified_data()函数根据输入的操作符、列名以及指定的value进行筛选,比如筛选出人均GDP大于5000的,则operation =  ‘>’ ;col_name =  ‘人均GDP’ ; value = 500。

  1. def get_specified_data(dictory, operation, col_name, value):
  2. """
  3. 根据输入的操作符、列名以及指定的value进行筛选,比如筛选出人均GDP大于5000的,则operation = '>', col_name = '人均GDP', value = 5000
  4. :param dictory: 原始数据
  5. :param operation: 操作符
  6. :param col_name: 需要比较的列
  7. :param value: 需要比较的值
  8. :return: 筛选之后的字典
  9. """
  10. new_dict = {}
  11. if col_name != "城市":
  12. for key in dictory.keys():
  13. # flag用于标记是否需要添加该行
  14. value = float(value)
  15. flag = 0
  16. if operation == '>':
  17. if dictory[key][col_name] > value:
  18. flag = 1
  19. elif operation == '>=':
  20. if dictory[key][col_name] >= value:
  21. flag = 1
  22. elif operation == '=':
  23. if dictory[key][col_name] == value:
  24. flag = 1
  25. elif operation == '<=':
  26. if dictory[key][col_name] <= value:
  27. flag = 1
  28. elif operation == '<':
  29. if dictory[key][col_name] < value:
  30. flag = 1
  31. else:
  32. flag = 0
  33. if flag == 1:
  34. new_dict[key] = {}
  35. new_dict[key] = dictory[key]
  36. else:
  37. for key in dictory.keys():
  38. # flag用于标记是否需要添加该行
  39. flag = 0
  40. if operation == '>':
  41. if key > value:
  42. flag = 1
  43. elif operation == '>=':
  44. if key >= value:
  45. flag = 1
  46. elif operation == '=':
  47. if key == value:
  48. flag = 1
  49. elif operation == '<=':
  50. if key <= value:
  51. flag = 1
  52. elif operation == '<':
  53. if key < value:
  54. flag = 1
  55. else:
  56. flag = 0
  57. if flag == 1:
  58. new_dict[key] = {}
  59. new_dict[key] = dictory[key]
  60. return new_dict
'
运行

效果图如下:

5.5多表数据统计排行

sort_data()函数根据key和reverse对数据进行排序。dictory: 传入的字典对象。
key: 需要排序的关键字,即哪一列。reverse: 是否从大到小排序,false即为从小到大排序,最后return 返回数据。

  1. #数据排行
  2. def sort_data(dictory, key, reverse):
  3. """
  4. 根据key和reverse对数据进行排序
  5. :param dictory: 传入的字典对象
  6. :param key: 需要排序的关键字,即那一列
  7. :param reverse: 是否从大到小排序,false即为从小到大排序
  8. :return:
  9. """
  10. data = dictory
  11. if not reverse:
  12. data = dict(sorted(data.items(), key=lambda d: d[1][key], reverse=False)) #字典的升序
  13. else:
  14. data = dict(sorted(data.items(), key=lambda d: d[1][key], reverse=True)) #字典的降序
  15. return data
'
运行

效果图如下:

5.6多表数据合并生成新excel文件

该功能在主函数中实现并调用save()函数保存合并后的数据并生成新的excel文件。

  1. while(1):
  2. index_str = input("请选择需要导入的文件序号(多个文件导入时用空格分开, 输入0则导入所有文件,输入多文件则自动合并):")
  3. index_list = index_str.split(' ')
  4. try:
  5. index_list.remove('')
  6. except:
  7. pass
  8. choice_file_list = []
  9. if index_list[0] == '0':
  10. choice_file_list = files
  11. break
  12. else:
  13. try:
  14. for item in index_list:
  15. choice_file_list.append(files[int(item)-1])
  16. except:
  17. print("输入序号有误")
  18. continue
  19. if choice_file_list:
  20. break
  21. else:
  22. print("输入序号有误")
  23. data = load_data(choice_file_list)
  24. print("导入数据成功\n")
  25. def save(dictory):
  26. name = input("请输入文件名(无需加后缀):")
  27. book = xlwt.Workbook()
  28. sheet = book.add_sheet('Sheet1', cell_overwrite_ok=True)
  29. keys = list(data[list(data.keys())[0]].keys())
  30. head = ["城市"]
  31. head.extend(keys)
  32. for h in range(len(head)):
  33. sheet.write(0, h, head[h])
  34. cities = list(dictory.keys())
  35. for city in range(len(cities)):
  36. sheet.write(city+1, 0, cities[city])
  37. for key in range(len(keys)):
  38. sheet.write(city+1, key+1, dictory[cities[city]][keys[key]])
  39. book.save('./data/'+name+'.xls')
  40. print("保存成功")

效果图如下:

6.总结

这个程序是我将课本上的纯理论应用到实践中,进一步加深了我对知识的理解。最后将完整代码奉上:

  1. import os
  2. import xlrd2 #xlrd: 对Excel进行读相关操作
  3. import xlwt #xlwt: 对Excel进行写相关操作,且只能创建一个全新的Excel然后进行写入和保存。
  4. import numpy
  5. import matplotlib
  6. from prettytable import PrettyTable #PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格
  7. from matplotlib import pyplot as plt
  8. def get_files_name():
  9. """
  10. 用于获取文件名
  11. :return: 返回值为文件名组成的列表
  12. """
  13. file_list = os.listdir('./data')
  14. return file_list
  15. #保存生产excel表
  16. def load_data(file_list):
  17. """
  18. 用于读取指定的文件并保存至字典数据结构中
  19. :param file_list: 需要加载的文件列表
  20. :return: 保存了文件内容的字典
  21. """
  22. dictory = {}
  23. for file in file_list:
  24. # 获取表格文件
  25. book = xlrd2.open_workbook('./data/'+file)
  26. # 获取表格中的所有sheet
  27. names = book.sheet_names()
  28. # 获取第一个sheet
  29. sheet = book.sheet_by_index(0)
  30. # 获取当前表格的行数
  31. rows = sheet.nrows
  32. # 获取当前表格的列数
  33. cols = sheet.ncols
  34. # 获取表头文件,即表格第一行
  35. head = sheet.row_values(0)
  36. for row in range(rows-1):
  37. # 如果当前字典中没有该城市则创建一个
  38. if not sheet.cell_value(row+1, 0) in dictory.keys():
  39. dictory[sheet.cell_value(row+1, 0)] = {}
  40. for col in range(cols-1):
  41. dictory[sheet.cell_value(row+1, 0)][head[col+1]] = float(sheet.cell_value(row+1, col+1))
  42. return dictory
  43. #数据排行
  44. def sort_data(dictory, key, reverse):
  45. """
  46. 根据key和reverse对数据进行排序
  47. :param dictory: 传入的字典对象
  48. :param key: 需要排序的关键字,即那一列
  49. :param reverse: 是否从大到小排序,false即为从小到大排序
  50. :return:
  51. """
  52. data = dictory
  53. if not reverse:
  54. data = dict(sorted(data.items(), key=lambda d: d[1][key], reverse=False)) #字典的升序
  55. else:
  56. data = dict(sorted(data.items(), key=lambda d: d[1][key], reverse=True)) #字典的降序
  57. return data
  58. def get_specified_cols(dictory, col_name_list):
  59. """
  60. 筛选出指定的列
  61. :param dictory:原始字典
  62. :param col_name_list: 需要筛选出的列名,城市名默认出现
  63. :return: 筛选之后的字典
  64. """
  65. new_dict = {}
  66. for key in dictory.keys():
  67. new_dict[key] = {}
  68. for col_name in col_name_list:
  69. new_dict[key][col_name] = dictory[key][col_name]
  70. return new_dict
  71. def get_specified_data(dictory, operation, col_name, value):
  72. """
  73. 根据输入的操作符、列名以及指定的value进行筛选,比如筛选出人均GDP大于5000的,则operation = '>', col_name = '人均GDP', value = 5000
  74. :param dictory: 原始数据
  75. :param operation: 操作符
  76. :param col_name: 需要比较的列
  77. :param value: 需要比较的值
  78. :return: 筛选之后的字典
  79. """
  80. new_dict = {}
  81. if col_name != "城市":
  82. for key in dictory.keys():
  83. # flag用于标记是否需要添加该行
  84. value = float(value)
  85. flag = 0
  86. if operation == '>':
  87. if dictory[key][col_name] > value:
  88. flag = 1
  89. elif operation == '>=':
  90. if dictory[key][col_name] >= value:
  91. flag = 1
  92. elif operation == '=':
  93. if dictory[key][col_name] == value:
  94. flag = 1
  95. elif operation == '<=':
  96. if dictory[key][col_name] <= value:
  97. flag = 1
  98. elif operation == '<':
  99. if dictory[key][col_name] < value:
  100. flag = 1
  101. else:
  102. flag = 0
  103. if flag == 1:
  104. new_dict[key] = {}
  105. new_dict[key] = dictory[key]
  106. else:
  107. for key in dictory.keys():
  108. # flag用于标记是否需要添加该行
  109. flag = 0
  110. if operation == '>':
  111. if key > value:
  112. flag = 1
  113. elif operation == '>=':
  114. if key >= value:
  115. flag = 1
  116. elif operation == '=':
  117. if key == value:
  118. flag = 1
  119. elif operation == '<=':
  120. if key <= value:
  121. flag = 1
  122. elif operation == '<':
  123. if key < value:
  124. flag = 1
  125. else:
  126. flag = 0
  127. if flag == 1:
  128. new_dict[key] = {}
  129. new_dict[key] = dictory[key]
  130. return new_dict
  131. #制作图表
  132. def draw_plot(dictory):
  133. font = {'family': 'MicroSoft Yahei', 'weight': 'bold', 'size': 7}
  134. matplotlib.rc('font', **font) #设置中文字体
  135. # 定义三个颜色
  136. index = numpy.arange(len(dictory.keys()))
  137. color = [(256 / 256, 0 / 256, 0 / 256, 1),
  138. (0 / 256, 0 / 256, 256 / 256, 1),
  139. (0 / 256, 256 / 256, 0 / 256, 1),
  140. (0 / 256, 0 / 256, 0 / 256, 1)]
  141. first_key = list(dictory.keys())
  142. first_key = first_key[0]
  143. cols = list(dictory[first_key].keys())
  144. data = []
  145. for i in range(len(cols)):
  146. data.append([])
  147. for key in dictory.keys():
  148. for col in range(len(cols)):
  149. data[col].append(dictory[key][cols[col]])
  150. offset = -1/4
  151. for i in range(len(cols)):
  152. plt.bar(index+offset, data[i], color=color[i], width=1 / 5) #通过bar函数可以用柱状图来表达一些变量的统计分布
  153. offset += 1/4
  154. plt.xticks(index, dictory.keys())#表示刻度
  155. plt.legend(cols)#给图像加上图例
  156. plt.show()
  157. def show_data(dictory):
  158. try:
  159. keys = list(dictory[list(dictory.keys())[0]].keys())
  160. except:
  161. print("当前数据为空")
  162. return
  163. head = ['城市']
  164. head.extend(keys)
  165. table = PrettyTable(head)
  166. for key in dictory.keys():
  167. line = [key]
  168. for key_2 in keys:
  169. line.append(dictory[key][key_2])
  170. table.add_row(line)
  171. print(table)
  172. def save(dictory):
  173. name = input("请输入文件名(无需加后缀):")
  174. book = xlwt.Workbook()
  175. sheet = book.add_sheet('Sheet1', cell_overwrite_ok=True)
  176. keys = list(data[list(data.keys())[0]].keys())
  177. head = ["城市"]
  178. head.extend(keys)
  179. for h in range(len(head)):
  180. sheet.write(0, h, head[h])
  181. cities = list(dictory.keys())
  182. for city in range(len(cities)):
  183. sheet.write(city+1, 0, cities[city])
  184. for key in range(len(keys)):
  185. sheet.write(city+1, key+1, dictory[cities[city]][keys[key]])
  186. book.save('./data/'+name+'.xls')
  187. print("保存成功")
  188. # 打印菜单
  189. def menu():
  190. print(" ----------Excel 数据分析师----------")
  191. print("{:<30}".format(" ==============功能菜单============== "))
  192. print("{:<30}".format(" 1. 显示当前数据 "))
  193. print("{:<30}".format(" 2. 以柱状图展示当前数据 "))
  194. print("{:<30}".format(" 3. 提起指定列 "))
  195. print("{:<30}".format(" 4. 定向筛选指定元素 "))
  196. print("{:<30}".format(" 5. 数据排行 "))
  197. print("{:<30}".format(" 6. 重新加载数据 "))
  198. print("{:<30}".format(" 7. 保存当前数据 "))
  199. print("{:<30}".format(" 0. 退出程序 "))
  200. print("{:<30}".format(" ==================================== "))
  201. print("{:<30}".format(" 说明:输入相应数字后按下回车选择指定功能 "))
  202. print('\n')
  203. if __name__ == "__main__":
  204. # 导入文件
  205. files = get_files_name()
  206. data = {}
  207. print("当前data文件夹下的文件如下:")
  208. num = 1
  209. for file in files:
  210. print(num, file)
  211. num += 1
  212. while(1):
  213. index_str = input("请选择需要导入的文件序号(多个文件导入时用空格分开, 输入0则导入所有文件,输入多文件则自动合并):")
  214. index_list = index_str.split(' ')
  215. try:
  216. index_list.remove('')
  217. except:
  218. pass
  219. choice_file_list = []
  220. if index_list[0] == '0':
  221. choice_file_list = files
  222. break
  223. else:
  224. try:
  225. for item in index_list:
  226. choice_file_list.append(files[int(item)-1])
  227. except:
  228. print("输入序号有误")
  229. continue
  230. if choice_file_list:
  231. break
  232. else:
  233. print("输入序号有误")
  234. data = load_data(choice_file_list)
  235. print("导入数据成功\n")
  236. # 调用函数,打印菜单
  237. menu()
  238. while 1:
  239. choice = input("请选择指定功能:")
  240. if choice == '0':
  241. print("\n退出程序\n")
  242. exit()
  243. elif choice == '1':
  244. print("当前功能:显示当前数据")
  245. show_data(data)
  246. input('\n按下回车返回菜单')
  247. menu()
  248. elif choice == '2':
  249. print("当前功能:以柱状图显示数据")
  250. draw_plot(data)
  251. input('\n按下回车返回菜单')
  252. menu()
  253. elif choice == '3':
  254. print("当前功能:筛选指定列")
  255. keys = list(data[list(data.keys())[0]].keys())
  256. print("当前表格中的列如下:")
  257. num = 1
  258. for key in keys:
  259. print(num, key)
  260. num += 1
  261. choice_col_list = []
  262. while (1):
  263. index_str = input("请选择需要筛选出的列序号(多列之间用空格分开,0代表所有列):")
  264. index_list = index_str.split(' ')
  265. try:
  266. index_list.remove('')
  267. except:
  268. pass
  269. choice_file_list = []
  270. if index_list[0] == '0':
  271. choice_col_list = keys
  272. break
  273. else:
  274. try:
  275. for item in index_list:
  276. choice_col_list.append(keys[int(item) - 1])
  277. except:
  278. print("输入序号有误")
  279. continue
  280. if choice_col_list:
  281. break
  282. else:
  283. print("输入序号有误")
  284. data = get_specified_cols(data, choice_col_list)
  285. print("筛选成功")
  286. input('\n按下回车返回菜单')
  287. menu()
  288. elif choice == '4':
  289. print("当前功能:筛选指定行")
  290. keys = list(data[list(data.keys())[0]].keys())
  291. print("当前表格中的列如下:")
  292. num = 1
  293. print(num, "城市")
  294. num += 1
  295. for key in keys:
  296. print(num, key)
  297. num += 1
  298. col = int(input("请输入需要进行筛选的数据所在的列:"))-2
  299. if col == -1:
  300. col = '城市'
  301. else:
  302. col = keys[col]
  303. op_list = ['<', '<=', '=', '>=', '>']
  304. print("比较操作符如下:")
  305. num = 1
  306. for op in op_list:
  307. print(num, op)
  308. num += 1
  309. operation = int(input("请输入比较操作符前的序号:"))-1
  310. operation = op_list[operation]
  311. value = input("请输入需要筛选的值:")
  312. data = get_specified_data(data, operation, col, value)
  313. print("筛选成功")
  314. input('\n按下回车返回菜单')
  315. menu()
  316. elif choice == '5':
  317. print("当前功能:数据排序")
  318. keys = list(data[list(data.keys())[0]].keys())
  319. print("当前表格中的列如下:")
  320. num = 1
  321. for key in keys:
  322. print(num, key) #显示当前表格中的所有的列
  323. num += 1
  324. col = int(input("请输入需要进行排序的数据所在的列:")) - 1
  325. col = keys[col]
  326. reverse = input("排序方式:\n1 从大到小排序\n2 从小到大排序\n")
  327. if reverse == '1':
  328. data = sort_data(data, col, True)
  329. elif reverse == '2':
  330. data = sort_data(data, col, False)
  331. else:
  332. print("输入有误")
  333. input('\n按下回车返回菜单')
  334. menu()
  335. elif choice == '6':
  336. # 导入文件
  337. files = get_files_name()
  338. data = {}
  339. print("当前文件夹下的文件如下:")
  340. num = 1
  341. for file in files:
  342. print(num, file)
  343. num += 1
  344. while (1):
  345. index_str = input("请选择需要导入的文件序号(多个文件导入时用空格分开, 输入0则导入所有文件,输入多文件则自动合并):")
  346. index_list = index_str.split(' ')
  347. try:
  348. index_list.remove('')
  349. except:
  350. pass
  351. choice_file_list = []
  352. if index_list[0] == '0':
  353. choice_file_list = files
  354. break
  355. else:
  356. try:
  357. for item in index_list:
  358. choice_file_list.append(files[int(item) - 1])
  359. except:
  360. print("输入序号有误")
  361. continue
  362. if choice_file_list:
  363. break
  364. else:
  365. print("输入序号有误")
  366. data = load_data(choice_file_list)
  367. print("导入数据成功\n")
  368. # 打印菜单
  369. menu()
  370. elif choice == '7':
  371. print("当前功能:保存数据")
  372. save(data)
  373. input('\n按下回车返回菜单')
  374. menu()
  375. else:
  376. print("请输入正确的数字")
  377. input('\n按下回车返回菜单')
  378. menu()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/867853?site
推荐阅读
相关标签
  

闽ICP备14008679号