首页 > 编程语言 >python-合并大型Excel

python-合并大型Excel

时间:2024-03-06 11:55:17浏览次数:27  
标签:python Excel 合并 number file path out col row

使用openpyxl库实在是太慢,使用openpyxl的只读模式又需要excel的准确尺寸信息,但是每个excel的尺寸都不一样。

我使用zipfile解压excel文件,直接读取xml文件进行合并:

import os
from openpyxl import load_workbook
from openpyxl import Workbook
import zipfile
import re

total_row_number=0  #当此值等于0时,需要写入第一行列头

def 获取行数和列数(path:str)->tuple:
    '''
    返回excel中的第一个sheet页中的数据、第一个sheet的总行数和总列数
    '''
    zip_file= zipfile.ZipFile(path)
    zip_list = zip_file.namelist() # 得到压缩包里所有文件
    for zip_path in zip_list:
        if('xl/worksheets/sheet1.xml' == zip_path):
            filepath = zip_file.extract(zip_path)
            lines=None
            row_number=0
            col_number=0
            result=[]   #形成二维列表
            monitor_typeName = os.path.basename(path).split('-')[0]
            with open(filepath,'r',encoding='utf-8') as in_fd:
                lines = in_fd.readlines()
            for line in lines:
                if('<row r=' == line[:7]):
                    #行
                    row_number+=1
                elif('<c r=' == line[:5]):
                    #列
                    regex_str= r'<c.+?/c>'
                    col_list = re.findall(regex_str,line)
                    col_number=max(col_number,len(col_list))
                    # t=[re.findall(r'(?<=<t>).+?(?=</t>)|(?<=<v>).+?(?=</v>)',col)[0] for col in col_list]
                    t=[re.sub(r'<.+?>',"",col) for col in col_list]
                    result.append([monitor_typeName]+t)
            result[0][0]='监测类型' #修正下列头
            os.remove(filepath)
            zip_file.close()
            return (result,row_number,col_number);

basic_path ='D:\\BaiduSyncdisk\\temp\\2024年3月4日\\导出所有类型的变电台账数据\\'
files = [f for f in os.listdir(basic_path) if f.endswith(".xlsx")]

def 写入到excel中()->None:
    #速度太慢了。
    global files,basic_path
    out_workbook = Workbook(write_only=True)
    out_sheet=out_workbook.create_sheet()
    for file in files:
        path="{}{}".format(basic_path,file)
        if('明细合并结果' in path):continue
        data_2list,row_number,col_number=获取行数和列数(path)
        if(0!=total_row_number):
            data_2list=data_2list[1:]   #去掉猎头
        for line in data_2list:
            out_sheet.append(line)
        total_row_number+=row_number
        print("{} 以及合并完成。".format(file))
    out_workbook.save('{}{}'.format(basic_path,"明细合并结果.xlsx"))    #只写模式只能保存一次
    out_workbook.close();
def 写入到csv文件中():
    global files,basic_path,total_row_number
    with open("{}明细合并结果.csv".format(basic_path),'w',encoding='utf-8') as out_fd:
        for file in files:
            path="{}{}".format(basic_path,file)
            if('明细合并结果' in path):continue
            data_2list,row_number,col_number=获取行数和列数(path)
            if(0!=total_row_number):
                data_2list=data_2list[1:]   #去掉猎头
            str_list=['\t'.join(data) for data in data_2list]
            out_str='\n'.join(str_list)
            print(out_str,file=out_fd)
            total_row_number+=row_number
            print("{} 以及合并完成。".format(file));
if __name__ == "__main__":
    写入到csv文件中()

 

标签:python,Excel,合并,number,file,path,out,col,row
From: https://www.cnblogs.com/love-DanDan/p/18056230

相关文章

  • Rust 开发的高性能 Python 包管理工具,可替换 pip、pip-tools 和 virtualenv
    最近,我在Python潮流周刊中分享了一个超级火爆的项目,这还不到一个月,它在Github上已经拿下了8Kstar的亮眼成绩,可见其受欢迎程度极高!国内还未见有更多消息,我趁着周末把一篇官方博客翻译出来了,分享给大家。作者:@charliermarsh译者:豌豆花下猫@Python猫英文:uv:Pythonpackag......
  • 由区间合并->离散化
    `#include<iostream>#include<cstring>#include<vector>#include<algorithm>usingnamespacestd;typedefpair<int,int>PII;//数对type-类型define-定义pair-一对constintN=300......
  • 合并与分离及分离借形
    合并ctrl+j(join)其中,当选择多个物体时,-Selected选中项,是橙红色-Active活动项,橙黄色合并的方向为:Selected->Active分离选中一部分顶点分离编辑模式下,Ctrl+L(Link)选中相连项。拆分选中一部分顶点拆分,但仍属于同一物体。分离借形一种常见的手法S......
  • python的方法
    调用方法是必须先要又一个字符串变量,然后用“.”引出方法,函数则是直用1.常用方法说明:str表示一个字符串变量(1)str.lower()作用:返回的是str的里面的小写形式,并没有改变str(2.)str.upper()作用和lower相反,返回的变量大写(3.)str.split()作用:拆分出参数并形成列表(4.)str.count(s......
  • (36/60)无重叠区间、划分字母区间、合并区间
    无重叠区间leetcode:435.无重叠区间贪心法思路去掉最少的区间数就是最少重叠区间对的个数。(成对的算,因为一对里面需要去掉一个)类似射气球的处理方式。左边界法:按左边界从小到大排序。遍历每个元素。取当前元素右边界为right判断是否重叠。如果[i]right>[i+1]left......
  • Python zip函数及用法
    zip()函数是Python内置函数之一,它可以将多个序列(列表、元组、字典、集合、字符串以及range()区间构成的列表)“压缩”成一个zip对象。所谓“压缩”,其实就是将这些序列中对应位置的元素重新组合,生成一个个新的元组。importnumpyasnpmy_list=[11,12,13]my_tuple=(21......
  • 再谈Python之拼音拆分
    在《Python之拼音拆分》一文中已经给出了解决办法,但最近又遇到一些新的问题。一号同学最近在写一个工具,需要根据拼音字符串拆分出来所有可能的拼音组合这么说可能大家不太理解,比如zhangangai可以拆分为zhangangaizhangangaizhangangaizhangangai这尼玛就离谱的......
  • 2024/3/5如何在excel中支持base64编码解码
    在excel中按alt+f11(打开VisualBasic工具)。添加模块,粘贴一下代码`FunctionEncodeBase64(text$)DimbWithCreateObject("ADODB.Stream").Open:.Type=2:.Charset="utf-8".WriteTexttext:.Position=0:.Type=1:b=.ReadWithCreateObject("Micr......
  • Python之拼音拆分
    经常会需要用到将zhangwei转化为ZhangWei、Zw、Zhangw之类的,就涉及到一个拼音拆分算法,这里写了一个demo分享给大家我的思路是先将声母转换为大写,然后就可以根据大写字母来分割单个拼音学的拼音早忘差不多了,百度了一下,声母有bpmfdtnlgkhjqxrzczyw转化代码defsm(strs):sml......
  • python-Grequests,一个好用的 requests库的异步版本!
    Grequests是什么?grequests是一个Python库,它是requests库的异步版本。它允许你同时发送多个HTTP请求,而不必等待每个请求依次响应。可以在等待服务器响应的同时执行其他任务,从而节省时间并提高效率。安装Grequestspipinstallgrequests使用示例一:批量获取网页假如有一个......