You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决遍历.msg文件生成列表构建DataFrame时的ValueError问题

问题解决:提取.msg邮件信息时列表长度不匹配的处理

问题背景

使用extract_msg模块读取数千封.msg格式邮件,提取发件人、收件人、日期、正文等信息存入对应列表,但转换为DataFrame时触发ValueError。排查发现body列表长度为3429,其余列表长度均为3431,说明有2封邮件的正文提取异常。尝试用if-else将msg.body为None的情况替换为"empty",但body列表长度仍少2项,需修改循环逻辑实现空内容替换或直接跳过异常邮件。

原代码

提取邮件信息的循环代码

# 循环读取邮件
for filename in f:
    try:
        msg = extract_msg.Message(filename)
        paths.append(filename)
        senders.append(msg.sender)
        recipients.append(msg.to)
        dates.append(msg.date)
        subjects.append(msg.subject)
        body.append(msg.body)

构建DataFrame的代码

# 创建DataFrame
df= pd.DataFrame({'path':paths})
df['map'] = df['path'].str.split('\\').str[4]
df['bestand'] = df['path'].str.split('\\').str[-1]
df ['afzender']  = senders
df [ 'ontvanger'] = recipients
df['datum'] = dates
df['onderwerp'] = subjects
df ['tekst'] = body 

无效的修复代码

if msg.body is None:
    body.append("empty")
else:
    body.append(msg.body)

解决方案

之前的修复只处理了msg.body为None的情况,但忽略了读取邮件过程中抛出异常导致所有字段追加逻辑被跳过的场景,因此需要针对两种情况调整循环逻辑:

方案1:强制补全所有列表,空内容统一替换为"empty"

确保每一封邮件(包括提取异常的)都能在所有列表中生成对应项,避免长度不匹配:

# 初始化所有存储列表
paths = []
senders = []
recipients = []
dates = []
subjects = []
body = []

for filename in f:
    try:
        msg = extract_msg.Message(filename)
        # 处理各字段的空值情况
        paths.append(filename)
        senders.append(msg.sender if msg.sender is not None else "empty")
        recipients.append(msg.to if msg.to is not None else "empty")
        dates.append(msg.date if msg.date is not None else "empty")
        subjects.append(msg.subject if msg.subject is not None else "empty")
        # 单独处理正文空值
        body.append(msg.body if msg.body is not None else "empty")
    except Exception as e:
        # 打印异常信息便于排查
        print(f"处理邮件 {filename} 时出错: {str(e)}")
        # 给所有列表追加空值,保证长度一致
        paths.append(filename)
        senders.append("empty")
        recipients.append("empty")
        dates.append("empty")
        subjects.append("empty")
        body.append("empty")

方案2:直接跳过提取失败的邮件

如果不需要保留异常邮件的记录,可在捕获异常时不追加任何内容,确保所有列表长度严格一致:

# 初始化所有存储列表
paths = []
senders = []
recipients = []
dates = []
subjects = []
body = []

for filename in f:
    try:
        msg = extract_msg.Message(filename)
        # 先处理正文空值
        current_body = msg.body if msg.body is not None else "empty"
        # 所有字段正常提取后再追加到列表
        paths.append(filename)
        senders.append(msg.sender)
        recipients.append(msg.to)
        dates.append(msg.date)
        subjects.append(msg.subject)
        body.append(current_body)
    except Exception as e:
        # 跳过异常邮件,不执行任何追加操作
        print(f"跳过异常邮件 {filename}: {str(e)}")

内容的提问来源于stack exchange,提问作者brenda89

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:55:24