<返回更多

python 用os库和xlrd、xlwd库快速合并相同n个Excel文件操作实例

2021-10-21    懒人智慧办公
加入收藏

最近上班遇到一个新问题,新上线的医保系统太low,导出数据超过1万条的时候就导不出来了。逼得只有分为小表格导出,然后需要将这些表格汇总为一个大表格。刚好可以带大家学习如何利用Python/ target=_blank class=infotextkey>Python快速合并相同的几个Excel表格。当大家遇到类似问题时候就可以用这个简单办法解决问题了。比如有很多单位给你报表,你还在傻傻地一个表一个表的粘贴复制吗?

我们先来看看效果:

python 用os库和xlrd、xlwd库快速合并相同n个Excel文件操作实例

原始导出的文件结果


python 用os库和xlrd、xlwd库快速合并相同n个Excel文件操作实例

我导出了9个文件

最后我用Python快速将9个文件合成了一个汇总文件。本文教程给出了n的相同文件合并的方法(不相同文件也可以合并,只是机械地把数据汇总在一个表格中,只需要在参数设置中不设置标题就可以了。)

os库

path子库

os.listdir(url)#返回一个对应目录下所有文件名称的列表

使用需要引入path库

import os.path as op

操作

含有

os.path.abspath(path)

返回path在当前系统中的绝对路径

os.path.normpath(path)

返回统一用""分隔路径

os.path.relpath(path)

返回当前程序与文件之间的相对路径

os.path.dirname(path)

返回path中的目录名称

os.path.basename(path)

返回path中的最后的文件名称

os.path.join(path,*paths)

组合path与paths,返回一个路径字符串

os.path.exists(path)

判断路径对应的文件或者目录是否存在

os.path.isfile(path)

判断路径是否指向一个文件

os.path.isdir(path)

判断路径是否指向一个目录

os.path.getatime(path)

返回上一次访问该路径的时间

os.path.getmtime(path)

返回路径对应文件或目录最近修改时间

os.path.getctime(path)

返回路径对应文件或目录创建时间

os.path.getsize(path)

返回路径对应文件或目录字节大小

进程管理

执行程序或命令(cmd下的命令)

import os

os.system("c:\windows\System32\calc.exe")
python 用os库和xlrd、xlwd库快速合并相同n个Excel文件操作实例

打开系统计算器

import os
#下面的程序可以打开当前目录下的参数配置文件
os.startfile(r".合并Excel文件参数配置.txt")

环境参数

操作

含有

os.chdir(path)

修改当前程序操作的路径

os.getcwd()

返回程序的当前路径

os.getlogin()

获取当前系统登录用户名称

os.cpu_count()

获取当前系统cpu数量

os.urandom(n)

获取n个字节长度的随机字符串

xlrd库与xlwt库

本文使用一下几个xlrd的操作,这里简单说明,在基础学习中不做过多探讨。

本文使用一下几个xlrd的操作。

本程序需要使用的库文件

import os
import os.path as op
import xlrd as xlrd
import xlwt as xlwt

本次程序的接口参数

使用text文件作为接口文件,事先定义好3个接口参数(要合并的文件目录、是否存在标题、合并后生产文件的文件名称)。下面的备注信息为我设置的接口参数,大家可以根据自己的需要设置

<提示文本>在下面一行配置准备合并的Excel文件目录:

C:UsersAdministratorDesktop测试目录

<提示文本>第一行是否为标题行1表示是,0表示否:

1

<提示文本>设置汇总文件的文件名及文件格式:

汇总.xlsx

下面是设置接口参数的Python函数(之前案例多次讲解,直接给出代码很简单的):

def set_param():
    '''在当前文件目录下配置参数文件,若文件存在则打开文件,不存在则创建一个参数文件再打开'''
    try:
        f = open(r".合并Excel文件参数配置.txt", "x", encoding="utf-8")
        data = '<提示文本>在下面一行配置准备合并的Excel文件目录:nC:\Users\Administrator\Desktop\测试目录n<提示文本>第一行是否为标题行1表示是,0表示否:n0n<提示文本>设置汇总文件的文件名及文件格式:n汇总.xlsx'
        f.write(data)
        f.close()
    except FileExistsError:
        pass
    os.startfile(r".合并Excel文件参数配置.txt")

以上代码可以检查python程序目录下是否有接口文件,如有就打开供用户修改,没有就生产一个新的默认接口文件,再打开供用户修改。

程序获取配置好的接口参数

def get_param():
    '''获取用户配置好的配置文件'''
    param = {}
    f = open(r".合并Excel文件参数配置.txt", "r", encoding="utf-8")
    file_data = f.readlines()
    f.close()
    param["url"] = file_data[1].replace('n', "")
    param["title"] = eval(file_data[3].replace('n', ""))
    param["file_name"] = file_data[5].replace('n', "")
    return param

非常简单,之前多次分析过,就不再多说了。

本程序的核心程序类型,合并操作

基本思想就是通过os操作获取目标目录下的所有文件名列表,再循环遍历这些文件(需要使用op.join(param["url"], file)来打开完整的具体文件路径,不懂的可以回头看看本文上面讲述的os库子库path的具体操作)

然后通过xlrd库读取数据出入二位列表values中

最后通过xlwt库将values中的数据输出到需要保持的Excel文件中

以下给出具体的代码:

def merge_excel(param):
    '''合并同类型的Excel文件'''
    files = os.listdir(param["url"])
    values = []  # 存放获取的Excel文件内容
    for file in files:
        if file == param["file_name"]: continue  # 不统计与汇总文件同名的文件,避免可能的重复统计
        # 将所有文件的内容都放入values变量中
        url = op.join(param["url"], file)
        data = xlrd.open_workbook(url)
        table = data.sheets()[0]
        nrows = table.nrows
        if param["title"] == 1:
            # 若文件存在标题,把第一个读取到的文件标题做问所有内容的标题
            if file == files[0]:
                title = table.row_values(0)
                title.Append("数据来源")
                values.append(title)
        for i in range(param["title"], nrows):
            val = table.row_values(i)
            val.append(file)
            values.append(val)
    wa = xlwt.Workbook()  # 创建工作簿
    b = wa.add_sheet('汇总')  # 添加“汇总”工作表
    for i in range(len(values)):
        # 写入数据
        for j in range(len(values[i])):
            b.write(i, j, values[i][j])
    wa.save(op.join(param["url"], param["file_name"]))
    print("文件合并成功")

为了增强程序互动,设计一个非常简单的菜单。

这个菜单可以很方便地修改为其他程序的菜单,大家可以看看,非常之简单

def menu():
    '''打印用户交互界面,获取用户操作'''
    print("合并同类Excel文件".center(48, "*"))
    print("1.配置参数")
    print("2.运行合并程序")
    print("3.打开合并后文件目录")
    print("4.退出程序")
    print("".center(50, "*"))
    while True:
        try:
            s = eval(input("请输入操作序号"))
        except:
            s = 0
        if s in [1, 2, 3, 4]:
            return s
        else:
            print('输入错误请重新输入')

最后就是控制流程主函数了

def main():
    while True:
        m = menu()
        if m == 1:
            set_param()
            input("设置好后按回车继续")
        elif m == 2:
            param = get_param()
            merge_excel(param)
        elif m == 3:
            try:
                os.startfile(param["url"])
            except:
                print("还没有获取到配置参数中的文件路径,请先运行合并程序,输入2运行合并程序")
        elif m == 4:
            break

结语

今天终于把最后一篇python基础的操作写完了,来头条写文章最大的收获不少一分两分钱,而是真正的可以鞭策自己主动学习,持续学习。虽然一个上班族有的时候确实很忙,但能够学习进步、分析知识也比无聊玩手机好很多,感兴趣的可以一起讨论学习,共同进步。这是全套基础Python学习笔记的链接,贡献给各位粉丝们,能够阅读到这个地方也真心感谢您的支持!

最基础的python学习笔记(入门级)

 

本文全部代码

import os
import os.path as op
import xlrd as xlrd
import xlwt as xlwt


def menu():
    '''打印用户交互界面,获取用户操作'''
    print("合并同类Excel文件".center(48, "*"))
    print("1.配置参数")
    print("2.运行合并程序")
    print("3.打开合并后文件目录")
    print("4.退出程序")
    print("".center(50, "*"))
    while True:
        try:
            s = eval(input("请输入操作序号"))
        except:
            s = 0
        if s in [1, 2, 3, 4]:
            return s
        else:
            print('输入错误请重新输入')


def set_param():
    '''在当前文件目录下配置参数文件,若文件存在则打开文件,不存在则创建一个参数文件再打开'''
    try:
        f = open(r".合并Excel文件参数配置.txt", "x", encoding="utf-8")
        data = '<提示文本>在下面一行配置准备合并的Excel文件目录:nC:\Users\Administrator\Desktop\测试目录n<提示文本>第一行是否为标题行1表示是,0表示否:n0n<提示文本>设置汇总文件的文件名及文件格式:n汇总.xlsx'
        f.write(data)
        f.close()
    except FileExistsError:
        pass
    os.startfile(r".合并Excel文件参数配置.txt")


def get_param():
    '''获取用户配置好的配置文件'''
    param = {}
    f = open(r".合并Excel文件参数配置.txt", "r", encoding="utf-8")
    file_data = f.readlines()
    f.close()
    param["url"] = file_data[1].replace('n', "")
    param["title"] = eval(file_data[3].replace('n', ""))
    param["file_name"] = file_data[5].replace('n', "")
    return param


def merge_excel(param):
    '''合并同类型的Excel文件'''
    files = os.listdir(param["url"])
    values = []  # 存放获取的Excel文件内容
    for file in files:
        if file == param["file_name"]: continue  # 不统计与汇总文件同名的文件,避免可能的重复统计
        # 将所有文件的内容都放入values变量中
        url = op.join(param["url"], file)
        data = xlrd.open_workbook(url)
        table = data.sheets()[0]
        nrows = table.nrows
        if param["title"] == 1:
            # 若文件存在标题,把第一个读取到的文件标题做问所有内容的标题
            if file == files[0]:
                title = table.row_values(0)
                title.append("数据来源")
                values.append(title)
        for i in range(param["title"], nrows):
            val = table.row_values(i)
            val.append(file)
            values.append(val)
    wa = xlwt.Workbook()  # 创建工作簿
    b = wa.add_sheet('汇总')  # 添加“汇总”工作表
    for i in range(len(values)):
        # 写入数据
        for j in range(len(values[i])):
            b.write(i, j, values[i][j])
    wa.save(op.join(param["url"], param["file_name"]))
    print("文件合并成功")


def main():
    while True:
        m = menu()
        if m == 1:
            set_param()
            input("设置好后按回车继续")
        elif m == 2:
            param = get_param()
            merge_excel(param)
        elif m == 3:
            try:
                os.startfile(param["url"])
            except:
                print("还没有获取到配置参数中的文件路径,请先运行合并程序,输入2运行合并程序")
        elif m == 4:
            break


main()
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>