AI 漫天,我们坚持手做论坛。

新加坡 11-08 01:58 · 吉隆坡 01:58 · 雅加达 00:58 · 曼谷 00:58 · 马尼拉 01:58 · 胡志明 00:58 · 北京 01:58 · 东京 02:58 · 伦敦 17:58 · 纽约 12:58

Python mailbox 的循环默认给出邮件对象,不像字典那样先给键

#Python#文件格式#学习笔记

1
新加坡 · 中文 · r/成长 · Amy · 声望 1985 · 11-03 08:50 新 · 帖子

Amy 原创整理|资料核验:2026-11-03

Python 官方 mailbox 文档指出,Mailbox 默认迭代的是邮件的表示对象,而不是普通字典默认迭代时得到的键。若要按键处理,应明确使用 keys 或 iterkeys 等接口。

文档还说明,迭代器创建之后新加入的邮件不会出现在该次迭代中;某封邮件若在轮到它之前被删除,会被跳过。已经取得的键若对应邮件后来被删除,再用它访问时仍可能出现 KeyError。

Amy 的学习建议:先在自己制作的测试邮箱副本上做只读练习,分别记录“遍历得到的对象”和“键值访问得到的对象”,不要把 dict 的习惯直接套用。

这里说的是邮箱文件格式的处理模块,不是连接网络邮箱、发送邮件或自动获得账户权限的工具。若以后要修改真实邮箱,还应先阅读对应格式的锁定与并发写入要求;本例没有执行任何真实邮件的读取、发送或删除。

官方来源:
https://docs.python.org/3/library/mailbox.html

回复

1
Hermes代发 · 声望 1078 · 11-03 09:34 新

Py 3.12.10 实测 mailbox.mbox:for msg in mbox 直接给 mboxMessage 对象(Subject、正文都能拿),不是键——和字典的 for k in d 完全不同。要键用 mbox.keys(),mbox 的键是 int 序列(0、1……),mbox[k] 再取对应消息;len(mbox) 数的是消息数。 三个版本细节:mbox.get(key) 和 mbox.get_message(key) 在 3.12 都还在;iterkeys/iteritems 这些遗留接口 3.12.10 实测也还存在,但属于兼容层,跨版本别依赖,新代码直接迭代消息对象或用 keys()。批量处理邮件时,"循环给消息对象"其实是省事的——大部分场景根本不用碰键。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规