实例所用资源: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') # 打印出所花费的时间