Python 实现 excel 数据过滤(从入门到exe)

一、场景分析

假设有如下一份 excel 数据 shop.xlsx, 写一段 python 程序,实现对于车牌的分组数据过滤。

并以车牌为文件名,把店名输出到 车牌.txt 文件中。

比如 闽A.txt 文件内容为:

小林书店福州店1

小林书店福州店2 

二、依赖安装

程序依赖 pandas 对 excel 数据进行处理,所以需要先安装一下 pandas 依赖。

pip install pandas

 三、代码实现

import pandas as pd

# pandas 菜鸟教程
# https://www.runoob.com/pandas/pandas-dataframe.html

# 输入文档
input_path = r"C:\Users\Administrator\Desktop\py\excel\filter\shop.xlsx"

# 读取 Excel 文件,将其存储在一个DataFrame对象中
df = pd.read_excel(input_path)
# 行数,注意这个行数是数据行数,标题不算
rows = df.shape[0]
# 最终的数据结果是,{ '闽A':[], '闽B':[], '闽C':[]  }
result = {}

# 根据 车牌号,获取店名
for  i  in range(0, rows):
     # df.loc[ idx, 'Column1'] 
     # idx : 行标,从 0 开始,0 是数据行的第一行,即 excel 的第二行
     carNo = df.loc[i, '车牌']
     print( carNo )
     shopName = df.loc[i, '店名']
     print( shopName )
     # 以 carNo 为 key 从字典中获取值列表,没有返回 None,避免 KeyError
     value_list = result.get(carNo, None)
     if value_list:
          value_list.append(shopName)
     else:
          value_list = []
          value_list.append(shopName)
          result[ carNo ] = value_list

print( result )
# 根据 carNo, 生成 txt, 内容是 店名
# 遍历 key 列表
for key in result.keys():
     value_list = result.get(key)
     output_path = key+'.txt'
     # 以 write 的方式打开输出文件
     with open( output_path, 'w', encoding='utf-8') as file:
            num = len( value_list ) 
            end = num - 1
            for i, item in enumerate(value_list):
                 # 最后一行数据不需要换行
                 if i == end:
                     file.write(item)                         
                 else:
                     file.write(item + '\n')

四、运行

py shop_filter.py

 

不过上面程序的局限,就在于只能通过某一列,过滤出另一列数据,如果我们希望过滤出一整行数据,要怎么办呢?》》》》》更进一步

五、过滤出整行数据,保存到不同 excel 中

from openpyxl import Workbook
import pandas as pd

# pandas 菜鸟教程
# https://www.runoob.com/pandas/pandas-dataframe.html

# 输入文档
input_path = r"C:\Users\Administrator\Desktop\py\excel\filter\shop.xlsx"

# 读取 Excel 文件,将其存储在一个DataFrame对象中
df = pd.read_excel(input_path)
# 行数,注意这个行数是数据行数,标题不算
rows = df.shape[0]
# 列数
columns = df.shape[1]
# 最终的数据结果是,{ '闽A':[ [第一行数据], [第二行数据], [第三行数据] ], '闽B':[], '闽C':[]  }
result = {}

# 根据 车牌号,获取店名
for  i  in range(0, rows):
     # df.loc[ idx, 'Column1'] 
     # idx : 行标,从 0 开始,0 是数据行的第一行,即 excel 的第二行
     carNo = df.loc[i, '车牌']
     row_data = []
     for j in range(0, columns):
         # df.iloc[row_index, column_index] row_index 行索引;column_index 列索引
         row_data.append( df.iloc[ i, j ] )
     # 以 carNo 为 key 从字典中获取值列表,没有返回 None,避免 KeyError
     value_list = result.get(carNo, None)
     if value_list:
          value_list.append( row_data )
     else:
          value_list = []
          value_list.append( row_data )
          result[ carNo ] = value_list

title_list = ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1', 'M1', 'N1', 'O1', 'P1', 'Q1', 'R1', 'S1', 'T1', 'U1', 'V1', 'W1', 'X1', 'Y1', 'Z1']
# 根据 carNo, 生成 excel, 内容是 整行数据
# 遍历 key 列表
for key in result.keys():
     # 创建一个新的工作簿
     wb = Workbook()
     # 选择默认的活动工作表 
     ws = wb.active
     for i, item in enumerate( df.columns ):
          # 向工作表中写入表头
          title = title_list[i]
          ws[ title ] = item
     value_list = result.get(key)
     for row_data in value_list:
          ws.append( row_data )
     output_path = key+'.xlsx'
     wb.save( output_path )

 

不过上面程序的局限,就在于过滤出的 excel 有点多,如果我希望只放在一个 excel 里面,区分不同的 sheet 页就好,要怎么办呢?》》》》》更进一步

六、过滤出整行数据,保存到同一个 excel 中,区分不同 sheet 页

from openpyxl import Workbook
import pandas as pd

# pandas 菜鸟教程
# https://www.runoob.com/pandas/pandas-dataframe.html

# 输入文档
input_path = r"C:\Users\Administrator\Desktop\py\excel\filter\shop.xlsx"

# 读取 Excel 文件,将其存储在一个DataFrame对象中
df = pd.read_excel(input_path)
# 行数,注意这个行数是数据行数,标题不算
rows = df.shape[0]
# 列数
columns = df.shape[1]
# 最终的数据结果是,{ '闽A':[ [第一行数据], [第二行数据], [第三行数据] ], '闽B':[], '闽C':[]  }
result = {}

# 根据 车牌号,获取店名
for  i  in range(0, rows):
     # df.loc[ idx, 'Column1'] 
     # idx : 行标,从 0 开始,0 是数据行的第一行,即 excel 的第二行
     carNo = df.loc[i, '车牌']
     row_data = []
     for j in range(0, columns):
         # df.iloc[row_index, column_index] row_index 行索引;column_index 列索引
         row_data.append( df.iloc[ i, j ] )
     # 以 carNo 为 key 从字典中获取值列表,没有返回 None,避免 KeyError
     value_list = result.get(carNo, None)
     if value_list:
          value_list.append( row_data )
     else:
          value_list = []
          value_list.append( row_data )
          result[ carNo ] = value_list

title_list = ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1', 'M1', 'N1', 'O1', 'P1', 'Q1', 'R1', 'S1', 'T1', 'U1', 'V1', 'W1', 'X1', 'Y1', 'Z1']
# 根据 carNo, 生成 excel, 内容是 整行数据
# 遍历 key 列表
# 创建一个新的工作簿
wb = Workbook()
flag = True
for key in result.keys():
     if flag:
         # 选择默认的活动工作表 
         ws = wb.active
         ws.title = key
         flag = False
     else:     
         ws = wb.create_sheet(title=key)
     for i, item in enumerate( df.columns ):
          # 向工作表中写入表头
          title = title_list[i]
          ws[ title ] = item
     value_list = result.get(key)
     for row_data in value_list:
          ws.append( row_data )

wb.save( 'data.xlsx' )

 

不过分析上面程序,会发现整个程序的输入,就

input_path:要处理的 excel 文件路径;

df.loc[i, '车牌'] :车牌 这种我想过滤的列名。

能否写一个程序,输入这两个参数,然后运行输出结果,使之成为更通用的 程序呢?

》》》》》更进一步

七、输入过滤列名与文件路径

from openpyxl import Workbook
import pandas as pd

# pandas 菜鸟教程
# https://www.runoob.com/pandas/pandas-dataframe.html

# 提示用户输入 excel 位置 类似 C:\Users\Administrator\Desktop\py\shop.xlsx
input_path = input("请输入 excel 完整位置,包括文件名:")
# 提示用户输入需要过滤的列名
column_name = input("请输入需要过滤的列名:")
print('处理中')

# 读取 Excel 文件,将其存储在一个DataFrame对象中
df = pd.read_excel(input_path)
# 行数,注意这个行数是数据行数,标题不算
rows = df.shape[0]
# 列数
columns = df.shape[1]
# 最终的数据结果是,{ '闽A':[ [第一行数据], [第二行数据], [第三行数据] ], '闽B':[], '闽C':[]  }
result = {}

# 根据 车牌号,获取店名
for  i  in range(0, rows):
     # df.loc[ idx, 'Column1'] 
     # idx : 行标,从 0 开始,0 是数据行的第一行,即 excel 的第二行
     carNo = df.loc[i, column_name]
     row_data = []
     for j in range(0, columns):
         # df.iloc[row_index, column_index] row_index 行索引;column_index 列索引
         row_data.append( df.iloc[ i, j ] )
     # 以 carNo 为 key 从字典中获取值列表,没有返回 None,避免 KeyError
     value_list = result.get(carNo, None)
     if value_list:
          value_list.append( row_data )
     else:
          value_list = []
          value_list.append( row_data )
          result[ carNo ] = value_list

title_list = ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1', 'M1', 'N1', 'O1', 'P1', 'Q1', 'R1', 'S1', 'T1', 'U1', 'V1', 'W1', 'X1', 'Y1', 'Z1']
# 根据 carNo, 生成 excel, 内容是 整行数据
# 遍历 key 列表
# 创建一个新的工作簿
wb = Workbook()
flag = True
for key in result.keys():
     if flag:
         # 选择默认的活动工作表 
         ws = wb.active
         ws.title = key
         flag = False
     else:     
         ws = wb.create_sheet(title=key)
     for i, item in enumerate( df.columns ):
          # 向工作表中写入表头
          title = title_list[i]
          ws[ title ] = item
     value_list = result.get(key)
     for row_data in value_list:
          ws.append( row_data )

wb.save( 'data.xlsx' )

如果能够打包成 exe 文件,使之成为更通用的程序就更好了。

》》》》》更进一步

八、打包成 exe 程序

1、安装 pyinstaller

pip install pyinstaller

 2、验证安装是否成功

   pyinstaller --version

 3、在脚本所在位置执行

pyinstaller shop_filter.py

这将在当前目录下生成一个 dist 文件夹,其中包含打包后的可执行文件。

 

4、双击执行 exe 文件

输入参数 回车

5、查看生成结果

在 exe 所在路径下,生成了一个 data.xlsx 文件

九、扩展阅读

更多关于 python 操作 excel 的内容可以看我的 博文

作者:matrixlzp

物联沃分享整理
物联沃-IOTWORD物联网 » Python 实现 excel 数据过滤(从入门到exe)

发表回复