• Python 读取二进制、HTML 、XML 格式存储的 Excel 文件


     

    前言

    RPA 设计器版本: 2020.2

    Python 读取三种不同存储格式 Excel 文件

    Excel 文件的存储格式有多种, 有我们平常熟知的二进制格式,也有 HTML 格式,还有 XML 格式的等。

    目前,小编接触到 RPA 项目的 Excel 文件格式主要是上述说的三种格式(二进制、HTML 、XML )

    这里需要注意的是:RPA 设计器 2020.2 只支持二进制格式的 Excel 文件读取

    Python 读取二进制类型的 Excel 文件并返回 DataFrame 对象

    这里我直接将读取 Excel 的操作封装成函数放在 全局函数 使用,也可以使用 RPA 设计器自带的读取 Excel 组件

    
    def get_data_from_binary_excel(file_path):
        """
          从 binary 二进制格式的 excel 中获取数据
        :param file_path:
        :return: DataFrame
        """
        # 读取Excel 使用 pandas 读取二进制文件 excel
        pd_df = pd.read_excel(io=file_path)
        # 填充 NaN 将 nan 值用空字符串替换 df = rpa_pandas.fillna(df=pd_df)
        df = pd_df.fillna('')
        return df
    

    Python 读取 HTML 类型的 Excel 文件并返回 DataFrame 对象

    这里我直接将读取 Excel 的操作封装成函数放在 全局函数 中使用

    
    def get_data_from_html_excel(file_path, encoding='utf-8'):
        """
            从 html 格式的 excel 中获取数据
        :param file_path:
        :return: DataFrame
        """
        dfs = pd.read_html(file_path, encoding=encoding)
        pd_df = dfs[0]
        df = pd_df.fillna('')
        return df
    

    Python 读取 XML 类型的 Excel 文件

    思路:利用 Python 将 Excel 文件读取到内存中, 再利用正则表达式从 XML 标签中取出 Excel 表格中的数据

    def get_data_from_xml_excel(file_path):
        """
        解决 pandas.read_excel() 读取 excel 解析错误问题.
        读取 excel 文件,将每行数据都放入 list 列表中。
        返回值有二个,第一个是 excel 表头的长度,第二个是数据 list 集合
        """
        try:
            with open(file_path, 'rb') as tree:
                content = tree.read().decode('utf-8')
                # <ss:Cell ss:StyleID="headercell"><ss:Data ss:Type="String">单位</ss:Data></ss:Cell>
                # <ss:Cell ss:StyleID="headercell"><ss:Data ss:Type="String">单位</ss:Data><ss:NamedCell ss:Name="Print_Titles" />
                pattern1 = r"""<ss:Cell ss:StyleID="headercell"><ss:Data ss:Type="String">(.+?)</ss:Data><ss:NamedCell ss:Name="Print_Titles" /></ss:Cell>""" \
                           r"""|<ss:Cell ss:StyleID="headercell"><ss:Data ss:Type="String">(.+?)</ss:Data></ss:Cell>"""
                head_iter = re.finditer(pattern1, content)
                head_list = []
                for tpl in head_iter:
                    for i in range(len(tpl.groups())):
                        ele = tpl.groups()[i]
                        if ele is not None:
                            head_list.append(ele)
                            break
                # <ss:Cell ss:StyleID="odd"><ss:Data ss:Type="String"></ss:Data></ss:Cell>
                pattern2 = r"""<ss:Cell ss:StyleID="even"><ss:Data ss:Type="String">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" \
                           r"""|<ss:Cell ss:StyleID="odd"><ss:Data ss:Type="String">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" \
                           r"""|<ss:Cell ss:StyleID="oddfloat"><ss:Data ss:Type="Number">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" \
                           r"""|<ss:Cell ss:StyleID="oddfloat"><ss:Data ss:Type="String">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" \
                           r"""|<ss:Cell ss:StyleID="evenfloat"><ss:Data ss:Type="Number">([\s\S\w\W]*?)</ss:Data></ss:Cell>""" \
                           r"""|<ss:Cell ss:StyleID="evenfloat"><ss:Data ss:Type="String">([\s\S\w\W]*?)</ss:Data></ss:Cell>"""
                data_iter = re.finditer(pattern2, content)
                data_list = []
                count = 0
                for tpl in data_iter:
                    groups_len = len(tpl.groups())
                    # print(groups_len, tpl.groups(), tpl.span())
                    for i in range(groups_len):
                        ele = tpl.groups()[i]
                        # 排除不需要的脏数据
                        if ele is not None and ele != 'nan' and ele != 'null':
                            data_list.append(ele)
                            break
                        count += 1
                    # 若为空数据,或者 nan, null ,用空字符串替换
                    if count == groups_len:
                        data_list.append('')
                    # 每次内循环后都要清零
                    count = 0
                return len(head_list), data_list
        except Exception as e:
            print('解析 excel 发生异常 {}'.format(e))
            return 0, []
    
  • 相关阅读:
    windows计数器和瓶颈
    SQL Server 2005的Resource数据库
    Android学习笔记 json数据的解析
    android的消息处理机制(图+源码分析)——Looper,Handler,Message
    JS刷新验证码
    Java取得Unix的timestamp
    (转载)DBMS_SQL package 学习
    关于Java中Http下载的一些整理
    (转载)sqlserver内存释放
    关于EL表达式
  • 原文地址:https://www.cnblogs.com/feifeifeisir/p/15749148.html
Copyright © 2020-2023  润新知