日常有时会遇到一些合并单元格及带图片的excel文件,数据格式非常不规范,需要从中提取有用信息
import os
import pandas as pd
class extract_goods_info(object):
def __init__(self, path):
self.path = path # 初始化文件读取路径
def read_excel(self):
df = pd.read_excel(self.path)
df.dropna(how='all', axis=0, inplace=True) # 删除全为NUll的行和列
df.dropna(how='all', axis=1, inplace=True)
return df
# 获取元素所在的行、列号
def get_index_columns(self):
df = self.read_excel()
sku_index = []
sku_columns = []
for m, index in enumerate(df.index):
loc_data = df.loc[index].values # 每行的数据
if '默认条形码' in loc_data:
sku_index.append({'默认条形码': m})
if '包装信息' in loc_data:
sku_index.append({'包装信息': m})
if '项目编号' in loc_data:
sku_index.append({'项目编号': m})
if '商品名称' in loc_data:
sku_index.append({'商品名称': m})
if '商品型号' in loc_data:
sku_index.append({'商品型号': m})
if '供应商' in loc_data:
sku_index.append({'供应商': m})
if '保质期' in loc_data:
sku_index.append({'保质期': m})
if '项目星级' in loc_data:
sku_index.append({'项目星级': m})
if '品牌' in loc_data:
sku_index.append({'品牌': m})
if '商品净重KG' in loc_data:
sku_index.append({'商品净重KG': m})
if '商品毛重KG' in loc_data:
sku_index.append({'商品毛重KG': m})
if '适用月龄' in loc_data:
sku_index.append({'适用月龄': m})
# 获取列信息
for n, columns in enumerate(df.columns):
loc_data = df.loc[:, columns].values.tolist() # 每列的数据
if '默认条形码' in loc_data:
sku_columns.append({'默认条形码': n})
if '项目编号' in loc_data:
sku_columns.append({'项目编号': n})
if '商品名称' in loc_data:
sku_columns.append({'商品名称': n})
if '商品型号' in loc_data:
sku_columns.append({'商品型号': n})
if '供应商' in loc_data:
sku_columns.append({'供应商': n})
if '保质期' in loc_data:
sku_columns.append({'保质期': n})
if '项目星级' in loc_data:
sku_columns.append({'项目星级': n})
if '品牌' in loc_data:
sku_columns.append({'品牌': n})
if '商品净重KG' in loc_data:
sku_columns.append({'商品净重KG': n})
if '商品毛重KG' in loc_data:
sku_columns.append({'商品毛重KG': n})
if '适用月龄' in loc_data:
sku_columns.append({'适用月龄': n})
sku_column = self.genarate_dict(sku_index)
sku_index = self.genarate_dict(sku_columns)
return sku_index, sku_column
# 将列表嵌套字典改成一个字典
def genarate_dict(self, list_dict):
dict = {}
for m in list_dict:
for key, value in m.items():
dict[key] = value
return dict
# 生成每个字段的坐标值
def type_chage(self):
sku_index, sku_column = self.get_index_columns()
result = {}
for k, v in sku_index.items():
for m, n in sku_column.items():
if k == m:
result[m] = []
result[m].append(sku_column[m])
result[m].append(sku_index[k])
return result
# 提取有用信息
def extract_info(self):
df = self.read_excel()
result = self.type_chage()
# 生成最终产品信息
project_dict = {}
project_dict['默认条形码'] = df.iloc[int(result['默认条形码'][0]) + 1, int(result['默认条形码'][1])]
project_dict['项目编号'] = df.iloc[int(result['项目编号'][0]), int(result['项目编号'][1]) + 1]
project_dict['商品名称'] = df.iloc[int(result['商品名称'][0]), int(result['商品名称'][1]) + 1]
project_dict['商品型号'] = df.iloc[int(result['商品型号'][0]), int(result['商品型号'][1]) + 1]
project_dict['供应商'] = df.iloc[int(result['供应商'][0]), int(result['供应商'][1]) + 2]
project_dict['保质期'] = df.iloc[int(result['保质期'][0]), int(result['保质期'][1]) + 2]
project_dict['项目星级'] = df.iloc[int(result['项目星级'][0]), int(result['项目星级'][1]) + 2]
project_dict['品牌'] = df.iloc[int(result['品牌'][0]), int(result['品牌'][1]) + 2]
project_dict['商品净重KG'] = df.iloc[int(result['商品净重KG'][0]) + 2, int(result['商品净重KG'][1])]
project_dict['商品毛重KG'] = df.iloc[int(result['商品毛重KG'][0]) + 2, int(result['商品毛重KG'][1])]
project_dict['适用月龄'] = df.iloc[int(result['适用月龄'][0]) + 1, int(result['适用月龄'][1])]
return project_dict
if __name__ == '__main__':
path = 'D:/练手文件' # 输入文件夹路径,自动读取文件夹内容
out_path = 'D:/temp/out_put.xlsx' # 文件输出地址
data_list = []
for root, dirs, files in os.walk(path):
for file in files:
file_path = os.path.join(root, file)
class_sample = extract_goods_info(file_path) # 类的实例化
data = class_sample.extract_info()
data_list.append(data)
# # 输出结果到excel
data_result = pd.DataFrame(data_list)
data_result.to_excel(out_path, index=False)
print('success')