Python分割长消息文本文件:将消息字段拆分至CSV列
解决方案:将分隔式消息文本转换为结构化CSV
问题分析
你需要把以;分隔的消息文本,提取Sent:、From:、To:、Subject:标签对应的字段,以及消息正文,每条消息对应CSV的一行,各字段对应不同列。原代码仅按行分割写入,未做结构化提取,导致格式混乱。
实现代码
import csv import re # 定义正则匹配规则,一次性提取消息各字段 pattern = re.compile( r"Message (\d+) of \d+\s+" r"Sent:\s*(.+?)\s+" r"From:\s*(.+?)\s+" r"To:\s*(.+?)\s+" r"Subject:\s*(.+?)\s+" r"(.*)", re.DOTALL ) with open("emails.txt", encoding="utf-8") as txt, open('theoutput.csv', 'w', newline='', encoding="utf-8") as csvfile: # 定义CSV表头 fieldnames = ['ID', 'Sent', 'From', 'To', 'Subject', 'Body'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() # 读取整个文本,按;分割成单个消息块,过滤空内容 content = txt.read() messages = [msg.strip() for msg in content.split(';') if msg.strip()] for msg in messages: match = pattern.match(msg) if match: msg_id = match.group(1) # 处理正文:去除多余换行和空格,合并为单行 body = ' '.join(line.strip() for line in match.group(6).splitlines() if line.strip()) # 写入结构化数据到CSV writer.writerow({ 'ID': msg_id, 'Sent': match.group(2).strip(), 'From': match.group(3).strip(), 'To': match.group(4).strip(), 'Subject': match.group(5).strip(), 'Body': body })
代码说明
- 正则匹配:启用
re.DOTALL模式让.匹配换行符,一次性捕获消息ID、发送时间、发件人、收件人、主题和正文。 - 消息分割:读取完整文本后用
;分割,过滤空块避免无效数据。 - 正文处理:将正文中的换行和冗余空格替换为单个空格,保证正文在CSV中为单行格式。
- CSV写入:使用
DictWriter按表头映射字段,确保各数据对应正确列。
内容的提问来源于stack exchange,提问作者Roger S
相关产品推荐
相关产品推荐

