Python汇总指定文件下所有excel文件第二节

18 篇文章 6 订阅
9 篇文章 2 订阅
本文介绍了如何使用Python高效地合并多个Excel文件中的数据。包括汇总文件夹下所有Excel的第一张工作表内容,合并所有工作表内容,以及从不同文件夹中提取特定行数据并转置。提供的代码示例详细展示了实现过程,适用于批量处理大量Excel数据的场景。
摘要由CSDN通过智能技术生成

Python批量数据汇总


前言

提示:以下是本篇文章正文内容,下面案例可供参考,源码可直接使用,需要源数据可评论联系我;

一、Python汇总文件夹下所有文件

汇总文件夹下所有excel的第一张工作表内容到新工作表。

1.源码

代码如下(示例):

# coding:utf-8

import xlrd
import os
import xlwt
from xlutils.copy import copy

"""
将文件夹下所有excel文件合并成一个文件
注意:
    本代码仅支持合并excel文件第一个sheet,如果合并的excel文件有多个sheet,只会读取和合并第一个sheet,
    需要合并的excel文件如果有多个sheet需要修改代码的merge_excel()函数
思路:
    1.获取路径下所有文件,注意 本代码没有异常处理
    2.新建一个excel文件,用于存储全部数据
    3.逐个打开需要合并的excel文件,逐行读取数据,再用一个列表来保存每行数据。最后该列表中会存储所有的数据
    4.向excel文件中逐行写入
"""


def get_allfile_msg(file_dir):
    for root, dirs, files in os.walk(file_dir):
        '''
        print(root) #当前目录路径  
        print(dirs) #当前路径下所有子目录  
        print(files) #当前路径下所有非目录子文件 
        '''
        return root, dirs, [file for file in files if file.endswith('.xls') or file.endswith('.xlsx')]


def get_allfile_url(root, files):
    """
    将目录的路径加上'/'和文件名,组成文件的路径
    :param root: 路径
    :param files: 文件名称集合
    :return: none
    """
    allFile_url = []
    for file_name in files:
        file_url = root + '/' + file_name
        allFile_url.append(file_url)
    return allFile_url


def all_to_one(root, allFile_url, file_name='allExcel.xls', title=None, have_title=True):
    """
    合并文件
    :param root: 输出文件的路径
    :param allFile_url: 保存了所有excel文件路径的集合
    :param file_name: 输出文件的文件名
    :param title: excel表格的表头
    :param have_title: 是否存在title(bool类型),默认为true,不读取excel文件的第0:return: none
    """
    # 首先在该目录下创建一个excel文件,用于存储所有excel文件的数据
    file_name = root + '/' + file_name
    create_excel(file_name, title)

    list_row_data = []
    for f in allFile_url:
        # 打开excel文件
        print('打开%s文件' % f)
        excel = xlrd.open_workbook(f)
        # 根据索引获取sheet,这里是获取第一个sheet
        table = excel.sheet_by_index(0)
        print('该文件行数为:%d,列数为:%d' % (table.nrows, table.ncols))

        # 获取excel文件所有的行
        for i in range(table.nrows):
            # 如果存在表头,则跳过第0行,否则不跳过
            if have_title and i == 0:
                continue
            else:
                row = table.row_values(i)  # 获取整行的值,返回列表
                list_row_data.append(row)

    print('总数据量为%d' % len(list_row_data))
    # 写入all文件
    add_row(list_row_data, file_name)


# 创建文件名为file_name,表头为title的excel文件
def create_excel(file_name, title):
    print('创建文件%s' % file_name)
    a = xlwt.Workbook()
    # 新建一个sheet
    table = a.add_sheet('sheet1', cell_overwrite_ok=True)
    # 写入数据
    for i in range(len(title)):
        table.write(0, i, title[i])
    a.save(file_name)


# 向文件中添加n行数据
def add_row(list_row_data, file_name):
    # 打开excel文件
    allExcel1 = xlrd.open_workbook(file_name)
    sheet = allExcel1.sheet_by_index(0)
    # copy一份文件,准备向它添加内容
    allExcel2 = copy(allExcel1)
    sheet2 = allExcel2.get_sheet(0)

    # 写入数据
    i = 1
    for row_data in list_row_data:
        for j in range(len(row_data)):
            sheet2.write(sheet.nrows + i, j, row_data[j])
        i += 1
    # 保存文件,将原文件覆盖
    allExcel2.save(file_name)
    print('合并完成')


if __name__ == '__main__':
    # 设置文件夹路径,
#    file_dir = 'D:\SoftWare\PythonWorkSpace\excel-test'
    file_dir = r'E:\py\python3.7\test\test01\3'
    # 获取文件夹的路径,该路径下的所有文件夹,以及所有文件
    root, dirs, files = get_allfile_msg(file_dir)
    # 拼凑目录路径+文件名,组成文件的路径,用一个列表存储
    allFile_url = get_allfile_url(root, files)
    # 设置文件名,用于保存数据
    file_name = 'output.xls'
    # 设置excle文件表头
    title = ['a', 'b', 'c', 'd']
    # have_title参数默认为True,为True时不读取excel文件的首行
    all_to_one(root, allFile_url, file_name=file_name, title=title, have_title=True)

二、Python合并所有工作表内容

1.源码

代码如下(示例):

import xlwings as xw

#1.新增工作表
def add_sheet():
    app=xw.App(visible=True,add_book=False)
    #1.打开原工作簿
    workbook = app.books.open("合并工作表.xlsx")
    #2.新增表格
    workbook.sheets.add("合并工作表")

    return workbook
    

   
#2.获取每个表中的最后位置信息
def get_sheet_value(workbook):
    listsht = workbook.sheets #获取所有工作表
    list_address = []   #创建一个空列表,放置每个表的最后位置信息

    for sheet in listsht:
        if sheet.name != "合并工作表":
            address_all = sheet.used_range.address.split("$")[-1]
            list_address.append(int(address_all))
            
    return list_address

#3.根据位置,将数值放进合并的表格中
def set_merge_sheet(workbook,list_address):
    #先写第一行数据
    workbook.sheets["合并工作表"].range("A1:E1").value = workbook.sheets[1].range("A1:E1").value
    
    #循环写入数值
    for address_one in list_address:
        #获得每一个表格对象
        sht = workbook.sheets[list_address.index(address_one)+1]

        str_address = "A2:"+"E"+str(address_one)  
        #获得每一个表格的值
        sht_value = sht.range(str_address).value

        #创建合并的表格对象
        sheet_merge = workbook.sheets["合并工作表"]

        #将这个值放到合并工作表中
        if list_address.index(address_one) == 0:
            sheet_merge.range(str_address).value = sht_value
        else:
            #获取合并单元格当前的有效区域
            str_name = sheet_merge.used_range.address.split("$")[-1]
            a_address = "A"+str(int(str_name)+1)+":"
            b_address = "E"+ str(int(str_name)+1+address_one)
            sheet_merge.range(a_address+b_address).value = sht_value

#4.保存和退出程序
def sava_close(workbook):
    workbook.save()
    workbook.close()
    


#python程序执行入口
if __name__ == "__main__":

    #1.新增工作表,返回workbook对象
    obj_workbook = add_sheet()

    #2.获取每个表最后的位置信息
    list_address =get_sheet_value(obj_workbook)

    #3.根据位置,将数值放进合并的表格中
    set_merge_sheet(obj_workbook,list_address)

    #4.保存和退出程序
    sava_close(obj_workbook)

    
    

三、Python合并不同(相同)文件夹指定行数据

提示:分别对应下面的源码1-4;901文件夹数据和906文件夹数据(其中906文件夹中的数据汇总的指定行数据可以与901中的是不同行,如果是相同行数据可直接使用源码一即可);
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.源码一

提示:合并第一个文件夹下相同格式文件指定行数据到output.xls文件;

代码如下(示例):

# coding:utf-8

import xlrd  #导入读取excel的模块,import语句用来导入其它python文件,称为module模块,使用该模块里定义的类,方法,或者变量,从而达到代码复用的目的
import os
import pandas as pd
import xlwt
from xlutils.copy import copy  #xlutils模块的功能是xlrd和xlwt的桥梁,解决了xlrd中book对象无法编辑的问题,通过copy模块将xlrd.Book对象转换为xlwt.Workbook对象,从而实现原始excel文件的编辑功能。

"""
将文件夹下所有excel文件合并成一个文件
注意:
    本代码仅支持合并excel文件第一个sheet,如果合并的excel文件有多个sheet,只会读取和合并第一个sheet,
    需要合并的excel文件如果有多个sheet需要修改代码的merge_excel()函数
思路:
    1.获取路径下所有文件,注意 本代码没有异常处理
    2.新建一个excel文件,用于存储全部数据
    3.逐个打开需要合并的excel文件,逐行读取数据,再用一个列表来保存每行数据。最后该列表中会存储所有的数据
    4.向excel文件中逐行写入
"""


def get_allfile_msg(file_dir):
    for root, dirs, files in os.walk(file_dir):
        '''
        print(root) #当前目录路径  
        print(dirs) #当前路径下所有子目录  
        print(files) #当前路径下所有非目录子文件 
        '''
        return root, dirs, [file for file in files if file.endswith('.xls') or file.endswith('.xlsx')]


def get_allfile_url(root, files):
    """
    将目录的路径加上'/'和文件名,组成文件的路径
    :param root: 路径
    :param files: 文件名称集合
    :return: none
    """
    allFile_url = []
    for file_name in files:
        file_url = root + '/' + file_name
        allFile_url.append(file_url)
    return allFile_url


def all_to_one(root, allFile_url, file_name='allExcel.xls', title=None, have_title=True):
    """
    合并文件
    :param root: 输出文件的路径
    :param allFile_url: 保存了所有excel文件路径的集合
    :param file_name: 输出文件的文件名
    :param title: excel表格的表头
    :param have_title: 是否存在title(bool类型),默认为true,不读取excel文件的第0:return: none
    """
    # 首先在该目录下创建一个excel文件,用于存储所有excel文件的数据
    file_name = root + '/' + file_name
    create_excel(file_name, title)

    list_row_data = []
    for f in allFile_url:
        # 打开excel文件
        print('打开%s文件' % f)
        excel = xlrd.open_workbook(f)
        # 根据索引获取sheet,这里是获取第一个sheet
        table = excel.sheet_by_index(0)
        print('该文件行数为:%d,列数为:%d' % (table.nrows, table.ncols))

        # 获取excel文件所有的行
#        for i in range(table.nrows):
#        table.nrows=(22,23,25,26)
        for i in range(28,table.nrows):
            # 如果存在表头,则跳过第0行,否则不跳过
            if have_title and i == 0:
                continue
            else:
                row = table.row_values(11)  # 获取整行的值,返回列表
                list_row_data.append(row)
                row = table.row_values(12)  # 获取整行的值,返回列表
                list_row_data.append(row)				
                row = table.row_values(20)  # 获取整行的值,返回列表
                list_row_data.append(row)
                row = table.row_values(21)  # 获取整行的值,返回列表
                list_row_data.append(row)
                row = table.row_values(23)  # 获取整行的值,返回列表
                list_row_data.append(row)
                row = table.row_values(24)  # 获取整行的值,返回列表
                list_row_data.append(row)
                row = table.row_values(26)  # 获取整行的值,返回列表
                list_row_data.append(row)

    print('总数据量为%d' % len(list_row_data))
    # 写入all文件
    add_row(list_row_data, file_name)



# 创建文件名为file_name,表头为title的excel文件
def create_excel(file_name, title):
    print('创建文件%s' % file_name)
    a = xlwt.Workbook()
    # 新建一个sheet
    table = a.add_sheet('sheet1', cell_overwrite_ok=True)
    # 写入数据
    for i in range(len(title)):
        table.write(0, i, title[i])
    a.save(file_name)


# 向文件中添加n行数据
def add_row(list_row_data, file_name):
    # 打开excel文件
    allExcel1 = xlrd.open_workbook(file_name)
    sheet = allExcel1.sheet_by_index(0)
    # copy一份文件,准备向它添加内容
    allExcel2 = copy(allExcel1)
    sheet2 = allExcel2.get_sheet(0)

    # 写入数据
    i = 0
    for row_data in list_row_data:
        for j in range(len(row_data)):
            sheet2.write(sheet.nrows + i, j, row_data[j])
        i += 1
    # 保存文件,将原文件覆盖
    allExcel2.save(file_name)
    print('合并完成')
	
	#df = pd.read_excel(r'C:\Users\gxcaoty\AppData\python3.7\test\test01\4\output.xls')  # 读取需要转置的文件
	#df = df.T  # 转置
	#df.to_excel(r'C:\Users\gxcaoty\AppData\python3.7\test\test01\4\TestResult.xls')  # 另存为xlsx文件
	


if __name__ == '__main__':
    # 设置文件夹路径,
#    file_dir = 'E:\py\python3.7\test\test01\8'
    file_dir = r'E:\py\python3.7\test\test01\14\901'
    # 获取文件夹的路径,该路径下的所有文件夹,以及所有文件
    root, dirs, files = get_allfile_msg(file_dir)
    # 拼凑目录路径+文件名,组成文件的路径,用一个列表存储
    allFile_url = get_allfile_url(root, files)
    # 设置文件名,用于保存数据
    file_name = 'output.xls'
    # 设置excle文件表头
    title = ['UA3P', '检测项目','管控标准','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','日期','合格率']
    # have_title参数默认为True,为True时不读取excel文件的首行
    all_to_one(root, allFile_url, file_name=file_name, title=title, have_title=True)
	
	
	
	
	
	
	

2.源码二

提示:合并第二个文件夹下相同格式文件指定行数据到output.xls文件(此处的行数据与第一个文件夹下的行可以不是同一行,可自行定义);

代码如下(示例):

import os	
import openpyxl
import xlwt,xlrd
import pandas as pd
from xlutils.copy import copy



#path = r'E:\py\python3.7\test\test01\14\906'
#filenames = os.listdir(path)
#for filename in filenames:
#   print(filename)   

#wb_temp=xlrd.open_workbook(filename,'rb') # 打开待复制的表
wb_temp=xlrd.open_workbook(r'E:\py\python3.7\test\test01\14\906\1.xls') # 打开待复制的表
sheets = wb_temp.sheet_names() # 获取工作簿中的所有工作表名字,形成列表元素
#print(sheets)#打印查看一下aa文件中存在的sheet页名字列表
sheet1 = wb_temp.sheet_by_index(0) # 根据索引获取第一个sheet #打印查看获得的sheet,所有工作表中的的第一个工作表,是一个对象
#print(sheet1)

row1=sheet1.row_values(11)
row2=sheet1.row_values(12)
row3=sheet1.row_values(19)
row4=sheet1.row_values(21)
row5=sheet1.row_values(23)
row6=sheet1.row_values(24)
row7=sheet1.row_values(26)
 
#wb_all=xlrd.open_workbook(r'E:\py\python3.7\test\test01\14\901\output.xls')#打开待粘贴的表
 
#sheets = wb_all.sheet_names()  # 获取工作簿中的所有表格
#sheet2 = wb_all.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个sheet
#k=sheet2.nrows #获取表中已经有的数据行数
workbook = xlrd.open_workbook(r'E:\py\python3.7\test\test01\14\901\output.xls') # 打开工作簿
sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
sheet2 = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个sheet
k=sheet2.nrows #获取表中已经有的数据行数
new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象
new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个工作表对象


for i,content in enumerate(row1):
   new_worksheet.write(36,i,content)
for i,content in enumerate(row2):
   new_worksheet.write(37,i,content)
for i,content in enumerate(row3):
   new_worksheet.write(38,i,content)
for i,content in enumerate(row4):
   new_worksheet.write(39,i,content)
for i,content in enumerate(row5):
   new_worksheet.write(40,i,content)
for i,content in enumerate(row6):
   new_worksheet.write(41,i,content)
for i,content in enumerate(row7):
   new_worksheet.write(42,i,content)

new_workbook.save('data.xls')  # 保存工作簿
 

3.源码三

提示:将两个文件夹合并后的数据进行转置输出;

代码如下(示例):

import numpy as np
import pandas as pd
df = pd.read_excel(r'E:\py\python3.7\test\test01\14\data.xls',dtype=None,converters={'':str})  # 读取需要转置的文件
#df = df.values
#np.fromfile('output',dtypes=np.int)
df = df.T  # 转置
#df['1']=df['1'].astype('int')
df.style.number_format_str = '0.000'
#for cell in df()
#	values = int(cell,values)
#	cell.number_format = '0.000'
#df.write_number()
#df = df.applymap(lambda x:'{:.2f}'.format(x)).applymap(lambda x:eval(x))
#print(df.dtypes)
#df = df.to_numeric(df,errors='coerce')
#df = df.drop(df[df[55].astype(float).isnull()].index)
#df = df.iloc[:,:].values
#df = df.values



df.to_excel(r'E:\py\python3.7\test\test01\14\TestResult.xlsx')  # 另存为xlsx文件

4.源码四

提示:将执行命令汇总运行;

代码如下(示例):

import os
os.system("python ./ACCNT.py")
os.system("python ./ACCNT1.py")
os.system("python ./ACCNT2.py")

该处使用的url网络请求的数据。


总结

提示:相互学习,欢迎评论留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若竹之心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值