学完了CSV文件,终于到了Excel,以前也接触过Excel,但仅限于做一些简单的表格,这一章开始学用Python来操作Excel文件。但与csv模块不同,Python中没有处理Excel文件(就是带有.xls和.xlsx扩展名的文件)的标准模块。所以需要xlrd和xlwt的拓展包。他们俩使得Python对Excel时期型数据的支持非常好。
下来开始学习第一部分。
筛选特定行
有些时候,你并不需要Excel文件中的所有行。例如,你可能只需要一个包含特定词或者数值的那些行,或者,你可能只需要那些与一个具体日期相关联的行。在这些情况下,可以使用Python筛选掉不需要的行,只保留需要的行。
1.行中的值满足某个条件
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
7 input_file = sys.argv[1]
8 output_file = sys.argv[2]
9
10 output_workbook = Workbook()
11 output_worksheet = output_workbook.add_sheet('jan_2013_output')
12
13 sale_amount_column_index = 3
14 with open_workbook(input_file) as workbook:
15 worksheet = workbook.sheet_by_name('january_2013')
16 data = []
17 header = worksheet.row_values(0)
18 data.append(header)
19 for row_index in range(1,worksheet.nrows):
20 row_list = []
21 sale_amount = worksheet.cell_value(row_index,
22 sale_amount_column_index)
23 if sale_amount > 1400.0:
24 for column_index in range(worksheet.ncols):
25 cell_value =
26 worksheet.cell_value(row_index,column_index)
27 cell_type = worksheet.cell_type(row_index,
28 column_index)
29 if cell_type == 3:
30 date_cell =
31 xldate_as_tuple(cell_value,workbook.datemode)
32 date_cell =
33 date(*date_cell[0:3]).strftime('%m/%d/%Y')
34 row_list.append(date_cell)
35 else:
36 row_list.append(cell_value)
37 if row_list:
38 data.append(row_list)
39
40 for list_index, output_list in enumerate(data):
41 for element_index, element in enumerate(output_list):
42 output_worksheet.write(list_index, element_index, element)
43
44 output_workbook.save(output_file)
解释一下代码:
第三行:datetime模块导入date函数,以使我们可以将数值转换为日期并对日期进行格式化。
第四行:从xlrd模块导入了两个函数,open_workbook函数是用来读取和分析Excel文件,而xldate_as_tuple函数可以将Excel中代表日期,时间或日期时间的数值转换为元组。只要将数值转换为元组,就可以提取出具体时间(例如:年,月,日)并将时间元素格式化成不同的时间格式(例如:1/1/2010或January 1,2010)。
第十行:实例化一个wlxt Workbook对象,以使我们可以将结果写入用于输出的Excel文件。
第十一行:使用xlwt的add_sheet函数为输出工作簿添加一个工作表jan_2013_output。
第十四行:使用xlrd的open_workbook函数打开用于输入的工作簿,并将结果赋给一个workbook对象。
第十五行:使用这个workbook对象的sheet_by_name函数引用名称为January_2013的工作表。
第十六行:创建了一个空列表data。我们将用输入文件中要写入输出文件中的那些行来补充这个列表。
第十七行:提取出标题行中的值。因为我们想保留标题行,而且检验这一行是否满足筛选条件没有意义,所以第十八行代码将标题行直接追加到data中。
第二十一行:创建了一个变量sale_amount,用来保存行中的销售额。cell_value函数使用的是sale_amount_column_index中的值来定位Sale Amount列,因为我们想保留销售额大于¥1400.00的哪些行,所以要使用这个变量作为检验条件。
第二十四行:创建for循环,来处理Sale Amount大于1400.0的那些行。对于这些行,我们先提取出每个单元格的值,赋给变量cell_value,再提取出每个单元格的类型,赋给变量cell_type,然后,检验行中的每个值是否是日期类型。如果是日期类型,那么就将这个值格式化成日期数据。为了生成一个每个值都正确格式化的行,又创建了一个空列表row_list。
第三十七行:我们为输入文件的每一行都创建空列表row_list,但是只使用值填充某些空列表(就是Sale Amount这列的值大于1400.0的那些行的空列表)。所以,对于输入文件的每一行,检验row_list是否为空,只将非空的row_list添加到data中。
在最后:我们在data中的各个列表之间和列表中的各个值之间进行迭代,将这些值写入输出文件。将要保留的行追加到一个新列表data中的主要原因是,这样可以得到新的连续的行索引值。于是,当我们将这些行写入输出文件时,他们看上去就像是一个连续的整体,行与行之间不会出现缺口。
补充:
如果你需要设定多个条件,那么可以将这些条件放在圆括号中,根据需要的逻辑顺序符用“|”或“&”连接起来。
这就是Excel筛选特定行,很抽象,很难懂。。。。。。。。。继续努力吧!
来源:CSDN
作者:HHsHH1234
链接:https://blog.csdn.net/HHsHH1234/article/details/104420164