狂自私

导航

大型xlsx文件内容快速读取

openpyxl的性能还是不够用,我经常会导出很多的xlsx文件获取里面的数据来分析操作。

下面的代码可以直接将xlsx的文本内容直接转为二维列表返回使用:

def 获取数据形成二维列表_原封不动版_V2(path:str)->list:
    zip_file= zipfile.ZipFile(path)
    monitor_typeName = os.path.basename(path).split('-')[0]
    # zip_list = zip_file.namelist() # 得到压缩包里所有文件
    #将被压缩的字符串找到
    字段值列表=[]
    filepath = zip_file.extract('xl/sharedStrings.xml')
    with open(filepath,'r',encoding='utf-8') as in_fd:
        lines = in_fd.readlines()
    line=lines[1]
    #妈的,wps会不记录为空的单元格。
    #这里不能如此粗暴,因为一个si下面可能有多个t标签,我被坑到了。
    #    字段值列表 = re.findall('(?<=<t>).+?(?=</t>)',line)
    si_list = re.findall('(?<=<si>).+?(?=</si>)',line)
    for si in si_list:
        temp_list = re.findall('(?<=<t>).+?(?=</t>)',si)
        字段值列表.append(''.join(temp_list))
    os.remove(filepath)
    #汇聚数据
    filepath = zip_file.extract('xl/worksheets/sheet1.xml')
    lines=None
    with open(filepath,'r',encoding='utf-8') as in_fd:
        lines = in_fd.readlines()
    合并为一行之后的字符串 = ''
    for line in lines:
        合并为一行之后的字符串+=line
    sheetData = re.findall(r'<sheetData>.+</sheetData>',合并为一行之后的字符串)[0]
    rows = re.findall(r'<row.+?</row>',sheetData)
    行列表=[]
    for row in rows:
        cells =re.findall(r'<c.+?</c>',row)
        values = re.findall(r'(?<=<v>)[\+\-\d\.]+?(?=</v>)',row)
        temp_list=[]
        for idx in range(len(cells)):
            if('t="s"' in cells[idx]):
                #字符串类型,需要被补足
                temp_list.append(字段值列表[int(values[idx])])
            elif('t="n"' in cells[idx]):
                #数值类型,不需要被补足
                temp_list.append(int(float(values[idx])))
            elif('t=' not in cells[idx]):
                #数值类型,不需要被补足
                temp_list.append(int(float(values[idx])))
            else:
                #其它类型,暂不考虑,但是需要输出,方便后续排查问题
                print(cells[idx])
        行列表.append(temp_list)
    os.remove(filepath)
    zip_file.close()
    return 行列表;

 

posted on 2024-10-31 22:50  狂自私  阅读(5)  评论(0编辑  收藏  举报