zoukankan      html  css  js  c++  java
  • 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, []
    
  • 相关阅读:
    LeetCode 230. 二叉搜索树中第K小的元素(Kth Smallest Element in a BST)
    LeetCode 216. 组合总和 III(Combination Sum III)
    LeetCode 179. 最大数(Largest Number)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
    指针变量、普通变量、内存和地址的全面对比
    MiZ702学习笔记8——让MiZ702变身PC的方法
    你可能不知道的,定义,声明,初始化
    原创zynq文章整理(MiZ702教程+例程)
  • 原文地址:https://www.cnblogs.com/feifeifeisir/p/15749148.html
Copyright © 2011-2022 走看看