我经常需要手工处理一些日报,怎么提升工作的效率呢?
用 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中
使用了之后,原来合并一周日报要半个小时,现在只用运行一遍,效率高太多啦!
我经常需要手工处理一些日报,怎么提升工作的效率呢?
用 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中
使用了之后,原来合并一周日报要半个小时,现在只用运行一遍,效率高太多啦!