要说在工作中最让人头疼的就是用同样的方式处理一堆文件夹中文件,这并不难,但就是繁。所以在遇到机械式的操作时一定要记得使用Python来合理偷懒!最近朋友找到我想对1000+的excel文件获取其中的一部分数据进行获取 ...
要说在工作中最让人头疼的就是用同样的方式处理一堆文件夹中文件,这并不难,但就是繁。所以在遇到机械式的操作时一定要记得使用Python来合理偷懒! 最近朋友找到我想对1000+的excel文件获取其中的一部分数据进行获取和整理。 首先,我先对他的需求做了一个简单的询问,内容包括获取数据的格式是否一致、数据所在位置是否一直、获取数据的逻辑是否一致,以及从他那里获取到一个标准数据的样式。 沟通下来他想处理的数据大概长这样: 他想获取的只是第二行数据中的公司、姓名、组别、电话号整合到一个文件中生成对应的四个列,这个过程中提到了一个比较特殊的点,这个信息有可能在sheet1中也有可能在sheet2中,也可能都存在,这个时候我就想一定要遍历sheet页。如果都存在的时候数据也是相同的,但只需要获取其中一条,并且最终的结果数据一定是没有重复的,那么在做的时候就要考虑判断是否存在重复数据了。 现在需求确定了,我们就要考虑脚本如何运行了,首先我们要获取excel所在文件夹,然后遍历这个文件夹中的所有excel文件,再依次遍历文件中的sheet页获取指定位置的数据,最后对数据进行格式的处理存到我们指定的文件中。这个过程就是一个简单的ETL(Extraction-Transformation-Loading)过程。 确定了逻辑后我们就可以开始编写我们想要的脚本了。 第一步设置引用的包和预设参数,我们要对系统文件进行处理需要引用os包,对excel处理可以引用xlrd包。 import os,xlrd # 下载xlrd # pip install xlrd=1.2.0 listname=['公司','姓名','单位','电话号'] # 数据表头 filename=[] # 文件名列表 result=[] # 结果列表 第二步遍历py文件所在目录下的所有文件。 def gci(filepath): #遍历filepath下所有文件,包括子目录 files = os.listdir(filepath) # 获取指定路径下的所有文件 for fi in files: if fi.split('.')[-1]!='py': # 去除列表中获取的python文件 fi_d = os.path.join(filepath,fi) # 路径拼接 filename.append(fi_d.replace('\\','/')) # 转换路径内容,转为一致的斜杠 gci(os.path.dirname(__file__)) # 获取python文件路径 第三步预设数据的格式处理。 def todata(text): while True: # 循环 if text.find(' ') != -1: # 有两个空格则转为一个 text=text.replace(' ',' ') elif text[0]==' ': # 去掉开头的格子 text=text[1:-1] elif text[-1]==' ': # 去掉结尾的格子 text=text[0:-2] else: text=text.replace(' ',',') # 空格转为逗号,方便转csv text=text.replace('\n','') # 去掉换行 text=text.replace(listname[0]+':','') # 去掉数据标题 text=text.replace(listname[1]+':','') text=text.replace(listname[2]+':','') text=text.replace(listname[3]+':','') return text 第四步遍历所有的excel获取数据。 # 循环获取excel中的sheet页数据 for filepath in filename: xl = xlrd.open_workbook(filepath) # 打开文件 for i in range(len(xl.sheet_names())): table1 = xl.sheets()[i] # 打开sheet页 try: temp_data=table1.row_values(1, start_colx=0, end_colx=None)[0] # 获取第二行数据并取第一个格子数据 except: continue if temp_data == '': # 如果为空则跳过该sheet页 continue # 查询数据中是否存在listname的内容,有一个不存在则跳过 if temp_data.find(listname[0]) == -1 or temp_data.find(listname[1]) == -1 or temp_data.find(listname[2]) == -1 or temp_data.find(listname[3]) == -1: continue if todata(temp_data) in result: # 数据格式转换,自定义函数 continue else: result.append(todata(temp_data)) # 转换后的数据插入到结果列表中 第五步结果写入到指定文件中。 # 数据写入csv文件 f=open(os.path.dirname(__file__)+'/result.csv','w',encoding='gbk') for rdata in result: f.write(rdata+'\n') f.close() 最后执行脚本,将执行的结果自己手动加了一个表头,如下图。(数据皆为随机造数,并不代表真实数据) 将数据进行一个统计,能够更好的反映出各组提交状态: |
2024-02-29
2024-01-22
2024-01-03
2023-12-27
2023-12-08
回答
回答
回答
回答
2