Python Excel轻松工作,三四线城市也能办公自动化

#编程#

python自动化办公

很多部门、岗位的工作,都有大量零零散散的excel文件,或是日积月累的,或是终端店面、用户提交上来的,往往一股脑儿的放在一个或几个目录里,一般来说一个目录下excel文件里表的格式基本一致。久了,总会某天老板或领导突然冷冷地将一个目录丢过来:把里面的excel数据合并成起来,甚至更进一步要求按年月或数据里某个地区项归类加合并...

看看目录,文件少则几十个,多则成百上千,甚至上万,咋搞?手动一个个打开复制粘贴,熬夜加班一周怕也搞不完,还担心出错。这时候应该想到python:“人生苦短,我用python!”

人生苦短,我用python。这是pythoner(用python语言的程序员往往喜欢自称pythoner,后面我们也会常用这个名词)间流行的一句话,是在宣传python可以帮助大家高效、轻松地解决日常问题。

作为一门通用的编程语言,python还有一个广为程序员所知的特性:胶水语言。因为它可以方便地黏合各种不同的工具、环境,将它们在数据上打通、整合,作出总体的功效来。

上面遇到的excel文件问题,就需要用python一起处理操作系统(不仅是windows哦,像macOS,Linux的也一样)的文件管理和微软的Excel数据。Python甚至还能方便的将这些结果再和数据库(无论是开源的MySQL或PostgreSQL,还是甲骨文的产品或微软的产品都可以),与网页整合在一起。不过,今天我们这里只讲用python整合大量Excel文件数据的工作。

Python语言直接提供了一个访问操作系统功能的库: os,它将windows,macOS,linux等不同操作系统的使用方法进行整合,给pythoner提供了简单、统一的使用方式。这带来一个好处,我们用os的方法编程写代码、软件就可以在windows,macOS,linux等不同操作系统下使用,换成程序员的说法:写出的程序是跨平台的。

今天主要关注 os 里的两个函数:listdir,isfile:

os.listdir(path='.')

函数的参数就用保存了大量excel文件的那个目录(如果你不指定的话,则默认会使用程序运行的当前目录),调用函数后它返回一个列表,列表里保存着指定目录下的文件名、子目录名,但是不包含子目录内部的。

os.path.isfile(path)

这个函数的参数就用一个个excel文件名,用它用来判断path指向的是不是一个文件,如果是就返回True,否则返回False(比如path是个目录或不存在的文件)。注意python会在程序运行时的目录下面找path指向的文件,所以从 os.listdir返回列表里获得文件名后,还需要补上目录名才好作为参数传给本函数。

了解这两个函数后,我们这样使用它们来处理老板指定目录下的excel文件:

def processExcelFiles(path, mergedData):

files = os.listdir(path)

print('开始分析目录 {p} 下的excel文件'.format(p = path))

for f in files:

filePath = os.path.join(path, f)

if os.path.isfile(filePath) and filePath.endswith('.xlsx'):

processFileData(filePath, mergedData)

处理目录下的excel文件

目录下的文件我们都可以自动操作了,剩下就该处理文件里的数据 - 也就是将上面代码的processFileData(filePath, mergedData)函数实现。结合上一次讲的,我们再一点点深入:

1,读一个excel文件的内容,找出属性列

假定原始excel文件的第一个sheet存着数据,其中第一列是省份信息。我们要按照省份把多个文件里的数据归类,然后每个省份的数据分别保存到一个新excel文件。

对excel文件对操作,我们还用上次介绍的openpyxl。假设文件表格的第一列存储的是省份名称。每个表的第一行是做列说明的表头信息,写代码处理数据时我们要将这一行跳过。

def processFileData(excelFile, mergedData):

wb = openpyxl.load_workbook(filename=excelFile)

dataSheetName = wb.sheetnames[0]

ws = wb[dataSheetName]

rowNum = 0

for rowData in ws.values:

if rowNum == 0 :

rowNum = rowNum + 1

continue # 跳过第一行 - 非数据的表头

else:

rowNum = rowNum + 1

province = rowData[0] #假设第一列存的是 省份

if province in mergedData:

mergedData[province].append(rowData)

else:

mergedData[province] = [rowData]

处理一个excel文件的数据

2,将文件合并入相应的文件

def saveProcessedData(provincesData, saveDir):

if not os.path.isdir(saveDir): # 保存目录不存在则自动创建

os.mkdir(saveDir)

print('将保存的省份文件个数:{c}'.format(c=len(provincesData)))

for province, rowsData in provincesData.items():

saveFile = os.path.join(saveDir, str(province) + '.xlsx')

wb = openpyxl.Workbook()

ws = wb.active

for row in rowsData:

ws.append(row)

wb.save(saveFile)

print('{c} 个文件已经保存到 {p}:'.format(c=len(provincesData), p=saveDir))

将处理的excel数据合并保存为新的excel文件

分析目录下众多excel文件得到的数据,我们用了一个python的字典变量来保存,并用数据里的省份作为字典的key,而值则是一个列表的列表 - excel里一行数据(列表)作为一个元素存在key的value里面。

自此我们实现了老板/老大给的“难题”,从此以后再来一批批量更大的excel文件,也只是小菜一碟了:不用加班熬夜,运行python程序,分分钟就能愉快地搞定。

上面代码整合到一起,可独立执行的程序放在了github上,可自行取用的:https://github.com/h53d/wxExamples/blob/master/python/mergeExcelFiles.py

(0)

相关推荐