我经常需要手工处理一些日报,怎么提升工作的效率呢?
用 Python !
背景是这样的:
每天都会收到一个项目的数据日报,然后我需要将这些日报和之前的历史数据进行合并。更复杂的情况是,每个日报都不止一个sheet,如果手工复制的话,一个文件就需要复制三遍。
想想工作量还是很大的,所以就需要通过python来解决这个问题了。
打开 Anaconda,点击 JupyterLab,启动。(是的我越来越懒了,懒到不愿意去维护开发环境了)
一、导入库
这里会使用 os
,xlrd
,pandas
,pathlib
四个库。
xlrd
是用来读取 xls 文件的,pandas
是用来合并数据和写文件的。
pathlib
是用来兼容windows和unix平台(linux or macos)的文件路径的
import os
import xlrd
import pandas as pd
from pathlib import Path
二、遍历要合并的文件
给一个目标文件夹,将这里面全部的文件都生成文件路径。
def file_name(file_dir):
list=[]
for file in os.listdir(file_dir):
if os.path.splitext(file)[1] == '.xls' or os.path.splitext(file)[1] == '.xlsx':
list.append(file)
return list
三、合并输出文件
def merge_xlsx(path,filenames,sheet_num,output_filename):
data = [] #定义一个空list
title = []
path_folder = Path(path)
for i in range(len(filenames)):
read_xlsx = xlrd.open_workbook(path_folder / filenames[i])
sheet_num_data = read_xlsx.sheets()[sheet_num] #查看指定sheet_num的数据
title = sheet_num_data.row_values(0) #表头
for j in range(1,sheet_num_data.nrows): #逐行打印
data.append(sheet_num_data.row_values(j))
content= pd.DataFrame(data)
#修改表头
content.columns = title
#写入excel文件
output_path = path_folder / 'output'
output_filename_xlsx = output_filename + '.xlsx'
if not os.path.exists(output_path):
print("output folder not exist, create it")
os.mkdir(output_path)
content.to_excel((output_path / output_filename_xlsx), header=True, index=False)
print("merge success")
四、写入变量并运行
下面是完整的代码:
import os
import xlrd
import pandas as pd
from pathlib import Path
def get_filename(file_dir):
list=[]
for file in os.listdir(file_dir):
if os.path.splitext(file)[1] == '.xls' or os.path.splitext(file)[1] == '.xlsx':
list.append(file)
return list
def merge_xlsx(path,filenames,sheet_num,output_filename):
data = [] #定义一个空list
title = []
path_folder = Path(path)
for i in range(len(filenames)):
read_xlsx = xlrd.open_workbook(path_folder / filenames[i])
sheet_num_data = read_xlsx.sheets()[sheet_num] #查看指定sheet_num的数据
title = sheet_num_data.row_values(0) #表头
for j in range(1,sheet_num_data.nrows): #逐行打印
data.append(sheet_num_data.row_values(j))
content= pd.DataFrame(data)
#修改表头
content.columns = title
#写入excel文件
output_path = path_folder / 'output'
output_filename_xlsx = output_filename + '.xlsx'
if not os.path.exists(output_path):
print("output folder not exist, create it")
os.mkdir(output_path)
content.to_excel((output_path / output_filename_xlsx), header=True, index=False)
print("merge success")
if __name__ == "__main__":
path = r'/Your/Path' #这里无论什么平台都按照unix风格来输入文件路径
filenames = get_filename(path)
merge_xlsx(path,filenames,0,"sheet1") #合并文件中第一个表的数据,输出到 output/sheet1.xlsx中
merge_xlsx(path,filenames,1,"sheet1") #合并文件中第二个表的数据,输出到 output/sheet2.xlsx中
使用了之后,原来合并一周日报要半个小时,现在只用运行一遍,效率高太多啦!