如何搜索Outlook邮件正文文本并提取对应FX数据赋值给新变量
解决方案
首先你现有代码存在2个逻辑问题需要先修正:
- 存在性判断写法错误:
if FX_volume1 and FX_volume2 in message.body的实际逻辑是「判断FX_volume1非空,且FX_volume2在正文里」,无法校验两个品种同时存在 - 循环跳出逻辑错误:只要遇到第一封主题不符合的邮件就直接终止遍历,会漏掉符合要求的历史邮件
接下来提取数值可以用「按行拆分匹配」的方案,适配你给出的逗号分隔每行格式,实现逻辑如下:
- 把邮件正文按换行符拆分为独立行
- 每行按逗号切割为「品种标识」和「数值」两部分
- 匹配到目标品种后,把对应数值赋值给新变量
- 匹配到两个变量后直接终止遍历,提高效率
也可以用正则匹配的方案,兼容行内有多余空格、品种后缀的场景。
下面是修改后的完整可运行代码:
import win32com.client import re # 配置要查找的品种 FX_volume1 = "BWP/USD" FX_volume2 = "CHF/AMD" # 初始化存储结果的变量 bwp_value = None chf_value = None outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") inbox = outlook.GetDefaultFolder(6) messages = inbox.Items messages.Sort("[ReceivedTime]", True) # 最多遍历最近20封邮件,避免遍历全部邮箱浪费时间 max_check_count = 20 checked_count = 0 for message in messages: checked_count += 1 if checked_count > max_check_count: break # 匹配主题 if not message.subject.startswith("FX SPOT FIGURES"): continue # 校验两个品种都在正文里 if FX_volume1 not in message.body or FX_volume2 not in message.body: continue # 提取正文开始处理 data = message.body # 方案1:按行拆分匹配(格式固定时使用) for line in data.splitlines(): line = line.strip() if not line or "," not in line: continue ticker, val = line.split(",", 1) # 只切第一个逗号,避免数值里带逗号出错 ticker = ticker.strip() # 匹配品种赋值 if ticker == FX_volume1: bwp_value = val.strip() # 如果品种可能带后缀比如示例里的CHF/AMD T,就改成startswith匹配 elif ticker.startswith(FX_volume2): chf_value = val.strip() # 两个值都取到就跳出循环 if bwp_value is not None and chf_value is not None: break # 输出结果或后续调用 if bwp_value and chf_value: print(f"{FX_volume1}的数值:{bwp_value}") print(f"{FX_volume2}的数值:{chf_value}") # 后续直接使用bwp_value和chf_value变量即可 else: print(f"未找到{FX_volume1}或{FX_volume2}的对应数据")
如果需要更灵活的匹配,可以把提取部分替换为正则方案:
# 方案2:正则匹配(格式有波动时使用) pattern1 = re.compile(rf"{re.escape(FX_volume1)}.*?,(\d+)") pattern2 = re.compile(rf"{re.escape(FX_volume2)}.*?,(\d+)") match1 = pattern1.search(data) match2 = pattern2.search(data) if match1: bwp_value = match1.group(1) if match2: chf_value = match2.group(1)
内容的提问来源于stack exchange,提问作者alec22
相关产品推荐
相关产品推荐

