从带合并单元格的excel读取信息

背景说明:

日常有时会遇到一些合并单元格及带图片的excel文件,数据格式非常不规范,需要从中提取有用信息
从带合并单元格的excel读取信息_第1张图片

解决思路:

  • 类似这种数据,有它本身固有的规律,如一次只有一个条码
  • 找出我们需要的字段名,获取该字段的行、列坐标,然后偏移取值
  • 其中使用了字典和列表的嵌套及解绑

具体代码:

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')

你可能感兴趣的:(经验贴,python,python)