3.4 在 Excel 工作簿中读取一组工作表
本章最开始的几小节演示了如何在一个工作表中筛选特定的行与特定的列。前一个小节演示了如何在一个工作簿的所有工作表中筛选特定的行与列。
但是,有些情况下,你只需要处理工作簿中的一组工作表。例如,你的工作簿可能包含很多工作表,但是你只需要处理其中的 20 个。在这种情况下,可以使用工组簿的 sheet_by_index 或 sheet_by_name 函数来处理一组工作表。
这一小节只提供了一个示例来演示如何在工作簿的一组工作表中筛选特定的行。之所以这样做,是因为到目前为止,你应该能够将前面各个示例中的筛选与选择操作集成到这个示例中了。
在一组工作表中筛选特定行
01. 基础Python
在这个示例中,我们想从第一个和第二个工作表中筛选出销售额大于 $1900.00 的那些行。要使用基础 Python 从第一个和第二个工作表中筛选出这样的行,在文本编辑器中输入下列代码,然后将文件保存为 11excel_value_meets_condition_set_of_worksheets.py:
1 #!/usr/bin/env python3 2 import sys 3 from datetime import date 4 from xlrd import open_workbook, xldate_as_tuple 5 from xlwt import Workbook 6 input_file = sys.argv[1] 7 output_file = sys.argv[2] 8 output_workbook = Workbook() 9 output_worksheet = output_workbook.add_sheet('set_of_worksheets') 10 my_sheets = [0,1] 11 threshold = 1900.0 12 sales_column_index = 3 13 first_worksheet = True 14 with open_workbook(input_file) as workbook: 15 data = [] 16 for sheet_index in range(workbook.nsheets): 17 if sheet_index in my_sheets: 18 worksheet = workbook.sheet_by_index(sheet_index) 19 if first_worksheet: 20 header_row = worksheet.row_values(0) 21 data.append(header_row) 22 first_worksheet = False 23 for row_index in range(1,worksheet.nrows): 24 row_list = [] 25 sale_amount = worksheet.cell_value\ 26 (row_index, sales_column_index) 27 if sale_amount > threshold: 28 for column_index in range(worksheet.ncols): 29 cell_value = worksheet.cell_value\ 30 (row_index,column_index) 31 cell_type = worksheet.cell_type\ 32 (row_index, column_index) 33 if cell_type == 3: 34 date_cell = xldate_as_tuple\ 35 (cell_value,workbook.datemode) 36 date_cell = date(*date_cell[0:3])\ 37 .strftime('%m/%d/%Y') 38 row_list.append(date_cell) 39 else: 40 row_list.append(cell_value) 41 if row_list: 42 data.append(row_list) 43 for list_index, output_list in enumerate(data): 44 for element_index, element in enumerate(output_list): 45 output_worksheet.write(list_index, element_index, element) 46 output_workbook.save(output_file)
第 10 行代码创建了一个列表变量 my_sheets,其中包含两个整数,表示要处理的工作表的索引值。
第 16 行代码创建了工作簿中所有工作表的索引值,并在这些索引值上应用一个 for 循环。
第 17 行代码检验 for 循环中要处理的索引值是否是 my_sheets 中的一个索引值。这个检验确保代码只处理那些我们想处理的工作表。
因为我们在工作表索引值之间迭代,所以在第 18 行代码中,需要使用工作簿的 sheet_by_index 函数与索引值一起引用当前工作表。
对于要处理的第一个工作表,第 19 行代码为 True,所以我们将标题行追加到 data 中,然后将 first_worksheet 设为 False。此后,和前面的示例一样,以同样的方法处理余下的数据行。对于第二个和此后要处理的工作表,脚本直接转到第 23 行代码来处理工作表中的数据行。
要运行这个脚本,在命令行中输入以下命令,然后按回车键:
python 11excel_value_meets_condition_set_of_worksheets.py sales_2013.xlsx\ output_files\11output.xls
你可以打开输出文件 11output.xls 查看一下结果。
02. pandas
使用 pandas 在工作簿中选择一组工作表非常容易。你只需在 read_excel 函数中将工作表的索引值或名称设置成一个列表就可以了。在这个示例中,我们创建一个索引值列表 my_sheets,然后在 read_excel 函数中设定 sheetname 等于 my_sheets。
要使用 pandas 选择一组工作表,在文本编辑器中输入下列代码,然后将文件保存为 pandas_value_meets_condition_set_of_worksheets.py:
#!/usr/bin/env python3 import pandas as pd import sys input_file = sys.argv[1] output_file = sys.argv[2] my_sheets = [0,1] threshold = 1900.0 data_frame = pd.read_excel(input_file, sheetname=my_sheets, index_col=None) row_list = [] for worksheet_name, data in data_frame.items(): row_list.append(data[data['Sale Amount'].astype(float) > threshold]) filtered_rows = pd.concat(row_list, axis=0, ignore_index=True) writer = pd.ExcelWriter(output_file) filtered_rows.to_excel(writer, sheet_name='set_of_worksheets', index=False) writer.save()
要运行这个脚本,在命令行中输入以下命令,然后按回车键:
python pandas_value_meets_condition_set_of_worksheets.py\ sales_2013.xlsx output_files\pandas_output.xls
你可以打开输出文件 pandas_output.xls 查看一下结果。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论