从文件夹中庞大的excel(.xlsx)文件中提取并整合数据

Input

需要从文件夹树中提取有格式的单个数据格并汇总。
例如:
2017-2020x市蚊虫数据/2018/7月/abcds方法统计.xlsx

Output

每年中每个月的数据
例如:

xx县统计结果 yy县统计结果
2017 1 3.5 4.5
2017 2 5.5 3.5

思路

得到所有文件的绝对路径

file_collection = []
for dir, subDir, files in os.walk(path):# print(dir,'\t', subDir,'\t', files)for file in files:in_path = dir + '/' + filefile_collection.append(in_path)
# print(file_collection)

匹配目标文件名

key_files_name = []  #
for str in file_collection:key_files_name.append(re.findall(r'.*' + key_file_name + '.*', str))  # findall如果找不到会返回空值,只需要输入关键字即可找到文件全名key_file_name_df = pd.DataFrame(key_files_name, columns=['file_name'])
key_file_name_df = key_file_name_df.dropna()  # 丢掉空值
key_file_name_df.reset_index(drop=True, inplace=True)  # 重设索引,drop=True表示丢掉原本的索引
# print(key_file_name_df)ym_sheets_name = pd.DataFrame([], columns=get_columns(key_sheet_name))

匹配日期

这里要用正则表达式DIY自己要匹配的日期格式

for i, file in enumerate(key_file_name_df['file_name']):year = re.findall(r'\\.*\\', file)  # 匹配年份year[0] = year[0][1:5]  # 去掉开头和结尾的\\month = []if year[0] == '2018':month = re.findall(r'年(.*)月', file)  # 用年和月之间的值来匹配月份else:month = re.findall(r'\\(.*)月\/', file)  # 用月和\来匹配月份month[0] = month[0][5:]if len(month[0]) == 1:  # 将 1,2,3等月份改为01,02,03等month[0] = '0' + month[0]ym = np.concatenate((year, month))# print(ym)

匹配目标sheet

try:work_book = xlrd.open_workbook(file)
except:print('无法打开')print(file)
sheets_name = work_book.sheet_names()
# print(sheets_name)for key in key_sheet_name:sheet = match_blur_names(work_book,key) # 自定义的函数,完整代码在下方# if key in sheets_name:#     sheet = work_book.sheet_by_name(key)if sheet is not None:cell_value = sheet.cell_value(key_cell_xy[0], key_cell_xy[1])ym = np.append(ym, cell_value)print(ym)
if len(ym) == len(ym_sheets_name.columns):  # 排除无关数据ym_sheets_name.loc[i] = ym

再规范最终数据

排序,重设index

ym_sheets_name.sort_values(by=['Year', 'Month'], inplace=True) #根据年和月排序
ym_sheets_name.reset_index(drop=True, inplace=True)
print(ym_sheets_name)

保存数据

偷懒保存为csv,当然可以DIY成别的格式了

ym_sheets_name.to_csv('E:/2017-2020/' + key_file_name + '汇总.csv', encoding='gbk',index=False) # 保存为csv

完整代码

import os
import re
import pandas as pd
import numpy as np
import xlrdpath = "E:/2017-2020/2018-2020x市蚊虫密度"  # 文件夹目录# key_file_name: 要提取的文件的关键字,用于检索该文件
# key_sheet_name: 要提取的文件中的sheet名字
# key_cell_xy: 提取的数据在sheet中的横纵坐标def get_key_cell_xy(excel_xy):excel_xy[0]-=1excel_xy[1] = ord(excel_xy[1]) - ord('A')print(excel_xy)return excel_xydef get_columns(key_sheet_name):columns = ['Year', 'Month'] # 前两列固定是年和月for key_name in key_sheet_name:columns.append(key_name)return columnsdef match_blur_names(work_book, sheet_name):new_sheet_name = re.findall(sheet_name,str(work_book.sheet_names()))print(work_book.sheet_names())print(new_sheet_name)if new_sheet_name:sheet = work_book.sheet_by_name(new_sheet_name[0])return sheetreturn Nonedef search_for_key_value(key_file_name, key_sheet_name, key_cell_xy):# 读取所有文件并将文件名保存在file_collectionfile_collection = []for dir, subDir, files in os.walk(path):# print(dir,'\t', subDir,'\t', files)for file in files:in_path = dir + '/' + filefile_collection.append(in_path)# print(file_collection)# 匹配文件名key_files_name = []  #for str in file_collection:key_files_name.append(re.findall(r'.*' + key_file_name + '.*', str))  # findall如果找不到会返回空值key_file_name_df = pd.DataFrame(key_files_name, columns=['file_name'])key_file_name_df = key_file_name_df.dropna()  # 丢掉空值key_file_name_df.reset_index(drop=True, inplace=True)  # 重设索引,drop=True表示丢掉原本的索引# print(key_file_name_df)ym_sheets_name = pd.DataFrame([], columns=get_columns(key_sheet_name))# 匹配日期for i, file in enumerate(key_file_name_df['file_name']):year = re.findall(r'\\.*\\', file)  # 匹配年份year[0] = year[0][1:5]  # 去掉开头和结尾的\\month = []if year[0] == '2018':month = re.findall(r'年(.*)月', file)  # 用年和月之间的值来匹配月份else:month = re.findall(r'\\(.*)月\/', file)  # 用月和\来匹配月份month[0] = month[0][5:]if len(month[0]) == 1:  # 将 1,2,3等月份改为01,02,03等month[0] = '0' + month[0]ym = np.concatenate((year, month))# print(ym)# 将目标sheet中每个月(假如有)的数据提取出来try:work_book = xlrd.open_workbook(file)except:print('无法打开')print(file)sheets_name = work_book.sheet_names()# print(sheets_name)for key in key_sheet_name:sheet = match_blur_names(work_book,key)# if key in sheets_name:#     sheet = work_book.sheet_by_name(key)if sheet is not None:cell_value = sheet.cell_value(key_cell_xy[0], key_cell_xy[1])ym = np.append(ym, cell_value)print(ym)if len(ym) == len(ym_sheets_name.columns):  # 排除无关数据ym_sheets_name.loc[i] = ymym_sheets_name.sort_values(by=['Year', 'Month'], inplace=True)ym_sheets_name.reset_index(drop=True, inplace=True)print(ym_sheets_name)ym_sheets_name.to_csv('E:/2017-2020蚊虫密度/' + key_file_name + '市汇总.csv', encoding='gbk',index=False) # 保存为csvif __name__ == '__main__':key_files_name = ['x','y','z','balala'] # 可使用正则表达式查找文件名# key_sheets_name = [['a[区]?汇总[ ]*','b[区]?汇总[ ]*','c[区]?汇总[ ]*'],['a[区]?汇总[ ]*','b[区]?汇总[ ]*','c[区]?汇总[ ]*'],#                    ['a[区]?汇总[ ]*','b[区]?汇总[ ]*','c[区]?汇总[ ]*'],['a[区]?汇总[ ]*','b[区]?汇总[ ]*','c[区]?汇总[ ]*']]key_sheets_name = [['市汇总'],['市汇总'],['市汇总'],['市汇总']] # 可使用正则表达式查找sheetkey_cells_xy = [[7,'I'], [13,'I'], [19, 'I'],[7,'I']] # 直接对应excel里的一个点的坐标,仅支持[数字, 字母]for cell_xy in key_cells_xy:cell_xy = get_key_cell_xy(cell_xy)for i in range(4):search_for_key_value(key_files_name[i], key_sheets_name[i], key_cells_xy[i])

实战:从文件夹中庞大的excel(.xlsx)文件中提取并整合数据相关推荐

  1. 右键excel 文件后文件夹卡死,或打开Excel后文件所在的文件夹卡死

    右键excel 文件后文件夹卡死,或打开Excel后文件所在的文件夹卡死! 关闭资源管理器中的详细信息窗格,解决问题! 1.右键卡主效果:  2.解决方法打开资源管理器: 3.关闭资源管理器中的详细信 ...

  2. ASP.NET Core 导入导出Excel xlsx 文件

    ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...

  3. 读取指定文件夹里多个excel表,并将所有excel表数据整合到一个excel中

    1.找出指定文件夹里的所有文件 #-*- encoding: utf-8 -*-# 找出指定文件夹里的所有文件 import osfilePath = 'C:\\Users\\lzk\\Desktop ...

  4. 如何批量在文件夹中建立php,怎么批量创建文件夹_一次性创建多个文件夹方法_一聚教程网...

    相信大家在平时的工作或是生活中,经常会遇到需要创建多个文件夹的问题,那么对于这种一次性创建多个文件夹的问题怎么解决呢?这里文章就给大家具体介绍下批量创建多个文件夹的问题,感兴趣的一起来了解下. 日常工 ...

  5. vba ado返回集合_利用ADO,实现同一文件夹下多个EXCEL工作表的数据汇总

    大家好,今天继续讲解<VBA数据库解决方案>,今日讲解的是第37讲,利用ADO,实现同一文件夹下多个EXCEL工作表的数据汇总.最近的内容实用性比较强,如今日的内容,只把需要汇总的EXCE ...

  6. python3指定目录所有excel_Python——合并指定文件夹下的所有excel文件

    前提:该文件夹下所有文件有表头且具有相同的表头. import glob # 同下 from numpy import * #请提前在CMD下安装完毕,pip install numppy impor ...

  7. 使用pyhton将文件夹内多个excel表格合并成总表

    前言: 本文讲述使用python将需要处理的文件夹内多个excel文件内容进行合并,并输出为xlsx格式的总表.就比如一个文件夹里又有许多子文件夹,这些子文件夹里分布有excel文件,这里的pytho ...

  8. 读取文件夹内文件名至excel

    办公自动化01 ​ 工作中会遇到一些需求,面临这些需求可以使用python进行自动化处理,比如下面的一些需求. 读取文件夹内文件名至excel """ -*- codin ...

  9. 7 Python文件、文件夹、word及excel操作

    0 建议学时和要求 4学时 掌握os和os.path模块对文件和文件夹操作的函数 掌握shutil模块对文件和文件夹操作的函数 掌握扩展库openpyxl对Excel文件的操作 1 文件的高级操作 1 ...

最新文章

  1. hadoop数据流转过程分析
  2. Django之session
  3. eclipse手动pom本地包_环境篇--Eclipse如何远程连接Hadoop集群调试
  4. 最优传输理论和生成模型的几何观点
  5. Java中的Error和Exceptiond的异同点
  6. 这些让人看瞎了的设计!实力证明,数学才是世界的最终boss!
  7. 酷睿i7cpu适合的linux,CPU性能篇 - Core i7-4770K Linux之旅:有喜有忧_Linux新闻_Linux公社-Linux系统门户网站...
  8. 【渝粤题库】陕西师范大学500009 微机原理
  9. 在Windows Azure平台上部署服务
  10. 网络流量分类方法调研
  11. 2008年七月七日,按照要求我提前进入中心,今天就是我博士的第一天
  12. ❤Linux文件、目录与磁盘格式总结❤
  13. android是乐视手机刷机,乐视MAX(乐视 X900+)一键刷机教程,轻松刷机
  14. android studio高德地图的显示于定位(附带逆地理编码围栏)
  15. 开源python-向tensorflow-addons学习
  16. 收集的一些计算机硬件知识
  17. 软件包应用分享|基于RT-Thread的百度语音识别(二)
  18. 源码学习之LAMMPS的一个时间步是如何工作的
  19. 模拟实现strcmp函数
  20. 「Python条件结构」判断是否能同时被3、5、7整除

热门文章

  1. 1.什么是ES6,为什么使用它
  2. lmx2592频率源原理图和程序源码
  3. 利用matlab实现一维搜索算法
  4. 谷粒商城三阶段课件_高一地理必修一4:(课件)第一单元行星地球 第二节太阳对地球的影响...
  5. 拼积木—— 不同条件下的暴力dfs or 动规
  6. 邮件中写html代码规范,EDM电子邮件CSS和HTML编码规范
  7. 自学爬虫项目(二)一一利用selenium模拟淘宝登录,爬取商品数据
  8. 余杭区区委常委、副区长祝振伟一行莅临园区调研
  9. 自动定量包装秤厂家@逝去的青春年代
  10. springcloud H版+alibaba cloud4