基于Pandas按配方分类汇总多CSV文件月度总容积[m³]
非标准CSV批量分类汇总解决方案
核心思路
针对非标准键值对格式的CSV,放弃直接用pd.read_csv(),改为逐行解析提取目标字段,再批量遍历月度文件夹完成分类汇总。
1. 单个非标准CSV解析函数
根据CSV的键值对格式(比如配方名称: XXX、Total volume[m³]: 120.5),手动读取每行提取数据:
import os import pandas as pd import re def parse_single_csv(file_path): recipe_name = None total_volume = 0.0 with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: continue # 匹配配方名称(可根据实际格式调整匹配规则) if '配方名称:' in line: recipe_name = line.split(':', 1)[1].strip() # 用正则匹配总容积数值,兼容不同格式的数值写法 volume_match = re.search(r'Total volume\[m³\]:\s*(\d+\.?\d*)', line) if volume_match: try: total_volume = float(volume_match.group(1)) except ValueError: total_volume = 0.0 # 仅返回有效数据条目 if recipe_name: return {'配方名称': recipe_name, 'Total volume[m³]': total_volume} return None
2. 月度文件夹批量处理
遍历指定月度文件夹下的所有CSV,汇总单月数据:
def process_monthly_folder(folder_path): monthly_records = [] for filename in os.listdir(folder_path): if filename.lower().endswith('.csv'): full_path = os.path.join(folder_path, filename) record = parse_single_csv(full_path) if record: monthly_records.append(record) # 生成月度汇总表 if monthly_records: df = pd.DataFrame(monthly_records) summary = df.groupby('配方名称')['Total volume[m³]'].sum().reset_index() # 从文件夹名称提取月份信息 summary['月份'] = os.path.basename(folder_path) return summary return pd.DataFrame()
3. 多月度数据合并汇总
遍历根目录下的所有月度文件夹,合并所有结果:
def process_all_months(root_dir): all_summary = [] for folder_name in os.listdir(root_dir): folder_path = os.path.join(root_dir, folder_name) if os.path.isdir(folder_path): monthly_data = process_monthly_folder(folder_path) if not monthly_data.empty: all_summary.append(monthly_data) # 合并并排序最终结果 if all_summary: final_df = pd.concat(all_summary, ignore_index=True) final_df = final_df.sort_values(by=['月份', '配方名称']) return final_df return pd.DataFrame() # 示例调用 root_dir = '你的月度文件夹根路径' final_result = process_all_months(root_dir) # 导出到Excel方便查看 final_result.to_excel('配方容积月度汇总.xlsx', index=False)
灵活调整点
- 如果CSV编码是GBK,把
encoding='utf-8'改为encoding='gbk' - 若CSV格式不是
键: 值,修改parse_single_csv里的匹配逻辑(比如针对固定位置的字段用切片提取) - 可添加错误捕获,跳过损坏的CSV文件避免批量处理中断
内容的提问来源于stack exchange,提问作者ZeXVex
相关产品推荐
相关产品推荐

