从Outlook附件TXT动态提取数据并合并至Excel的技术问题
解决方案
一、处理Description区域的动态提取问题
由于Description条目长度不固定,依赖索引提取不可靠,建议基于关键字边界匹配的方式定位内容,核心思路是找到Description的起始标识和下一个固定业务字段的结束标识,提取中间内容:
方法1:字符串分割定位
假设TXT内容中存在明确的起始标记(如Description:)和后续固定字段(如Client:),可以用字符串切片提取:
with open(txt_file_path, 'r', encoding='utf-8') as f: content = f.read() # 定位起始和结束边界 desc_start = content.find('Description:') + len('Description:') # 假设下一个固定字段是'Client',根据实际业务字段调整 desc_end = content.find('Client:', desc_start) # 提取并清理内容 description = content[desc_start:desc_end].strip()
方法2:正则表达式匹配
如果字段边界有多种格式,用正则匹配更灵活,比如匹配Description:之后直到下一个大写开头的业务字段名:
import re with open(txt_file_path, 'r', encoding='utf-8') as f: content = f.read() # 正则匹配:提取Description后的内容,直到下一个大写字母开头的字段 match = re.search(r'Description:\s*(.*?)(?=\n[A-Z][a-z]+:)', content, re.DOTALL) if match: description = match.group(1).strip()
二、解决pandas写入Excel仅保留最后一个文件数据的问题
问题根源是每次写入默认覆盖原有文件,解决方案有两种:
方法1:统一收集数据后写入
初始化空列表存储所有文件的业务数据,遍历每个文件时将提取到的字典追加到列表,最后一次性转成DataFrame写入:
import pandas as pd # 初始化空列表存储所有数据 all_data = [] # 遍历所有Outlook附件TXT文件(假设已获取所有文件路径) for txt_path in all_txt_paths: # 执行你已有的Client、Project提取逻辑 client = extract_client(txt_path) project = extract_project(txt_path) # 用上述方法提取Description description = extract_description(txt_path) # 将单条数据存入字典,追加到列表 all_data.append({ 'Client': client, 'Project': project, 'Description': description }) # 统一写入Excel pd.DataFrame(all_data).to_excel('业务数据汇总.xlsx', index=False)
方法2:使用ExcelWriter追加写入(适合大文件分批处理)
如果数据量较大,不想一次性加载到内存,可以用pd.ExcelWriter的mode='a'参数追加,注意避免重复写入表头:
import pandas as pd from openpyxl import load_workbook for idx, txt_path in enumerate(all_txt_paths): # 提取单文件数据并转成DataFrame data = extract_single_file_data(txt_path) df = pd.DataFrame([data]) # 第一次写入创建文件并写表头,后续追加跳过表头 if idx == 0: df.to_excel('业务数据汇总.xlsx', index=False) else: with pd.ExcelWriter('业务数据汇总.xlsx', mode='a', engine='openpyxl', if_sheet_exists='overlay') as writer: df.to_excel(writer, index=False, header=False)
内容的提问来源于stack exchange,提问作者crossxbreaker
相关产品推荐
相关产品推荐

