实例3:python 删除excel中的多余列

实例所用资源:https://download.csdn.net/download/weixin_46623003/16096875

一、数据情况

1、原数据

1.xlsx和2.xlsx的内容如下,33.txt内容为空

2、结果(用openpyxl运行的结果)

1)New folder:

2)存放报错结果的文件夹:Faild(此处报错是因为openpyxl只能打开.xlsx文件)

3)存放结果的文件夹:Result

二、python实现过程

1、openpyxl

特定:操作简单,不需要安装excel软件,只能处理.xlsx文件

运行时间:
 

 1.xlsx 删除多余字段完成!

 2.xlsx 删除多余字段完成!

-------------------

所有操作已完成!!

time cost: 0.03686380386352539 s

代码:

import os
import openpyxl
import time

path = r'C:\个人文件夹\Data analysis learning\skit-learn\Workspace\document_vscode\test2\New folder'  # 放需要删除多余列的excel的文件夹
column_save = ['1_name','3_name','5_name','7_name','科目编码']  # 需要保留的字段

# 一、创建目录(文件夹)
def mkdir(root, folder):
    # 去除两端空白字符--如果strip()的参数为空,那么会默认删除字符串头和尾的空白字符(包括\n,\r,\t)
    root = root.strip()  

    # 判断路径是否存在,存在:True、不存在:False
    isExists = os.path.exists(root+'/'+folder) 

    # 判断结果
    if not isExists:  # 如果不存在则创建目录
        # 创建目录操作函数
        os.makedirs(root+'/'+folder)
        print(folder + ' 创建成功\n')

    # 注释掉
    # else:  # 如果目录存在则不创建,并提示目录已存在 
    #     print(folder + ' 目录已存在')
    

# 二、创建添加txt文件
def mktxt(root, txt_name, file):
    txt_path = root+'/'+txt_name
    with open( txt_path, 'a' ) as f:  # 以追加的方式打开文件,a:文件存在则追加内容,不存在则新建文件
        f.writelines('%s 内容修改失败\n' %file)

# 三、获取指定类型的文件名称
def read_file(path, file_type): #path 是指需要提取的文件夹所在路径;file_type是指文件的拓展名;txt格式的文件则输入‘.txt’    
    filenames = os.listdir(path) 
    files = []
    for filename in filenames:
        if os.path.splitext(filename)[1] == file_type:  # os.path.splitext(filename)[1]:取后缀名,os.path.splitext(filename)[1]:取不带后缀的文件名
            files.append(filename)
    return files

# 四、删除excel多余的列
def delete(file, column_save):
    wb = openpyxl.load_workbook(path +'/'+ file)
    sheet = wb.get_active_sheet()
    for i in range(sheet.max_column,0,-1):  # 从excel最后一列倒着判断
        # print(i)
        if sheet.cell(1,i).value.strip() not in column_save:
            # print('删除字段: %s ...' %sheet.cell(1,i).value)
            sheet.delete_cols(idx=i,amount=1)  # idx:参数用数字
            # print('\n删除成功\n')
    wb.save(path+'/Result/'+file.split(".")[0]+'_NEW.xlsx')


# 主要函数    
def main():

    # 1 获取路径path下的文件名
    # files = read_file(path, '.xlsx')  # 只获取xlsx文件名
    files = os.listdir(path)  # 获取所有文件名,包括文件夹

    # 2 新建存放结果的文件夹
    mkdir(path, 'Result')

    # 3 删除多余的列
    for file in files:
        try:
            delete(file, column_save)
            # wb.save(path+'/Result/'+file.split(".")[0]+'_NEW.xlsx')
            print(' %s 删除多余字段完成!\n' %file )
        except:
            mkdir(path, 'Faild')
            mktxt(path+'/Faild/', 'Error.txt',  file )
    print('-------------------')
    print('\n所有操作已完成!!\n')


if __name__ == '__main__':
    time_start=time.time()

    main()

    time_end=time.time()       
    print('time cost:',time_end - time_start,'s')  # 打印出所花费的时间

2、xlwings

特点:需要安装excel软件,大文件的读写更快,处理时间是openpyxl的1/6左右

1)代码一

运行时间:

 1.xlsx 删除多余字段完成!

 2.xlsx 删除多余字段完成!

-------------------

所有操作已完成!!

time cost: 15.351823091506958 s

代码:

import os
import xlwings as xw
import time

path = r'C:\个人文件夹\Data analysis learning\skit-learn\Workspace\document_vscode\test2\New folder'  # 放需要删除多余列的excel的文件夹
column_save = ['1_name','3_name','5_name','7_name','科目编码']  # 需要保留的字段

# 一、创建目录(文件夹)
def mkdir(root, folder):
    # 去除两端空白字符--如果strip()的参数为空,那么会默认删除字符串头和尾的空白字符(包括\n,\r,\t)
    root = root.strip()  

    # 判断路径是否存在,存在:True、不存在:False
    isExists = os.path.exists(root+'/'+folder) 

    # 判断结果
    if not isExists:  # 如果不存在则创建目录
        # 创建目录操作函数
        os.makedirs(root+'/'+folder)
        print(folder + ' 创建成功\n')

    # 注释掉
    # else:  # 如果目录存在则不创建,并提示目录已存在 
    #     print(folder + ' 目录已存在')
    

# 二、创建添加txt文件
def mktxt(root, txt_name, file):
    txt_path = root+'/'+txt_name
    with open( txt_path, 'a' ) as f:  # 以追加的方式打开文件,a:文件存在则追加内容,不存在则新建文件
        f.writelines('%s 内容修改失败\n' %file)

# 三、获取指定类型的文件名称
def read_file(path, file_type): #path 是指需要提取的文件夹所在路径;file_type是指文件的拓展名;txt格式的文件则输入‘.txt’    
    filenames = os.listdir(path) 
    files = []
    for filename in filenames:
        if os.path.splitext(filename)[1] == file_type:  # os.path.splitext(filename)[1]:取后缀名,os.path.splitext(filename)[1]:取不带后缀的文件名
            files.append(filename)
    return files

# 四、删除excel多余的列
def delete(file, column_save):
    app = xw.App(visible=True, add_book=False)
    # app.display_alerts=False  # 警告关闭
    app.screen_updating=False  # 关闭屏幕更新
    wb = app.books.open(path +'/'+ file)
    sheet = wb.sheets.active

    max_column = sheet['XFD1'].end('left').column
    for i in range(max_column,0,-1):  # 从excel最后一列倒着判断
        # print(i)
        if sheet.cells(1,i).value.strip() not in column_save:
            # print('删除字段: %s ...' %sheet.cells(1,i).value)
            sheet.cells(1, i).api.EntireColumn.Delete()  # 删除整列
            # print('\n删除成功\n')
    wb.save(path+'/Result/'+file.split(".")[0]+'_NEW.xlsx')
    wb.close()
    app.quit()


# 主要函数    
def main():

    # 1 获取路径path下的文件名
    # files = read_file(path, '.xlsx')  # 只获取xlsx文件名
    files = os.listdir(path)  # 获取所有文件名,包括文件夹

    # 2 新建存放结果的文件夹
    mkdir(path, 'Result')

    # 3 删除多余的列
    for file in files:
        try:
            delete(file, column_save)
            # wb.save(path+'/Result/'+file.split(".")[0]+'_NEW.xlsx')
            print(' %s 删除多余字段完成!\n' %file )
        except:
            mkdir(path, 'Faild')
            mktxt(path+'/Faild/', 'Error.txt',  file )
    print('-------------------')
    print('\n所有操作已完成!!\n')


if __name__ == '__main__':
    time_start=time.time()

    main()

    time_end=time.time()       
    print('time cost:',time_end - time_start,'s')  # 打印出所花费的时间

2)代码二

改进:对比上面的改动了以下部分

  • 用一个app(excel程序)打开所有wb(工作簿),所有操作完成后关闭app(这样提高了运行效率)
  • 保存的文件名不都用.xlsx格式,而用原来文件的格式,如.txt,操作后也是.txt(注意:txt格式也可以打开,如果字段以tab分割则可以正常操作,否则生成的txt文件有误)
  • app.screen_updating=True  # 最后打开屏幕更新,以免影响到下次excel的操作

运行时间:

 1.xlsx 删除多余字段完成!

 2.xlsx 删除多余字段完成!

-------------------

所有操作已完成!!

time cost: 3.2164769172668457 s

代码:

import os
import xlwings as xw
import time

path = r'C:\个人文件夹\Data analysis learning\skit-learn\Workspace\document_vscode\test2\New folder'  # 放需要删除多余列的excel的文件夹
column_save = ['1_name','3_name','5_name','7_name','科目编码']  # 需要保留的字段

# 一、创建目录(文件夹)
def mkdir(root, folder):
    # 去除两端空白字符--如果strip()的参数为空,那么会默认删除字符串头和尾的空白字符(包括\n,\r,\t)
    root = root.strip()  

    # 判断路径是否存在,存在:True、不存在:False
    isExists = os.path.exists(root+'/'+folder) 

    # 判断结果
    if not isExists:  # 如果不存在则创建目录
        # 创建目录操作函数
        os.makedirs(root+'/'+folder)
        print(folder + ' 创建成功\n')

    # 注释掉
    # else:  # 如果目录存在则不创建,并提示目录已存在 
    #     print(folder + ' 目录已存在')
    

# 二、创建添加txt文件
def mktxt(root, txt_name, file):
    txt_path = root+'/'+txt_name
    with open( txt_path, 'a' ) as f:  # 以追加的方式打开文件,a:文件存在则追加内容,不存在则新建文件
        f.writelines('%s 内容修改失败\n' %file)

# 三、获取指定类型的文件名称
def read_file(path, file_type): #path 是指需要提取的文件夹所在路径;file_type是指文件的拓展名;txt格式的文件则输入‘.txt’    
    filenames = os.listdir(path) 
    files = []
    for filename in filenames:
        if os.path.splitext(filename)[1] == file_type:  # os.path.splitext(filename)[1]:取后缀名,os.path.splitext(filename)[1]:取不带后缀的文件名
            files.append(filename)
    return files


# 主函数    
def main():

    # 1 获取路径path下的文件名
    # files = read_file(path, '.xlsx')  # 只获取xlsx文件名
    files = os.listdir(path)  # 获取所有文件名,包括文件夹

    # 2 新建存放结果的文件夹
    mkdir(path, 'Result')

    # 3 删除多余的列
    app = xw.App(visible=True, add_book=False)  # 打开可见excel,不新建
    # app.display_alerts=False  # 警告关闭
    app.screen_updating=False  # 关闭屏幕更新

    for file in files:
        try:
            wb = app.books.open(path +'/'+ file)
            sheet = wb.sheets.active
            """
            sheet['A1048576'].end('up').row  # 数据最大行数,结果:1 
            sheet['XFD1'].end('left').column  # 数据最大列数,结果:10

            sheet.used_range.shape  # 结果:(1, 10)
            sheet.api.UsedRange.Rows.count  # 数据最大行数,结果:1 
            sheet.api.UsedRange.Columns.count  # 数据最大列数,结果:10
            sheet.api.UsedRange.value[0]  # 第一行的内容,结果:('1_name', '2_name', '3_name', '4_name', '5_name', '6_name', '7_name', '8_name', '9_name', '10_name')
            """
            max_column = sheet.api.UsedRange.Columns.count

            for i in range(max_column,0,-1):  # 从excel最后一列倒着判断
                # print(i)
                if sheet.cells(1,i).value.strip() not in column_save:
                    # print('删除字段: %s ...' %sheet.cells(1,i).value)
                    sheet.cells(1, i).api.EntireColumn.Delete()  # 删除整列
                    # print('\n删除成功\n')
            wb.save(path+'/Result/'+'NEW_'+file)  # 另存为‘NEW_’+文件名的形式
            wb.close()
            print(' %s 删除多余字段完成!\n' %file )
        except:
            mkdir(path, 'Faild')
            mktxt(path+'/Faild/', 'Error.txt',  file )

    # app.display_alerts=True  # 最后需要将警告打开,以免影响到下次excel的操作
    app.screen_updating=True  # 最后需要打开屏幕更新,以免影响到下次excel的操作
    app.quit()

    print('-------------------')
    print('\n所有操作已完成!!\n')


if __name__ == '__main__':
    time_start=time.time()

    main()

    time_end=time.time()       
    print('time cost:',time_end - time_start,'s')  # 打印出所花费的时间

 

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值