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

如何用Python的VObject从vCard中提取名、姓与中间名?

解决vCard N字段提取名、姓、中间名的问题

你遇到的AttributeError是因为Name对象没有name这个属性,vCard的N字段对应结构化数据有固定的属性命名,完全匹配vCard标准里的N字段格式:N:姓;名;中间名;前缀;后缀。

假设你用的是vobject库处理vCard,Name对象的正确属性对应关系如下:

  • family: 姓(对应N字段的第一部分)
  • given: 名(对应N字段的第二部分)
  • additional: 中间名(对应N字段的第三部分)
  • prefix: 姓名前缀
  • suffix: 姓名后缀

针对你的测试vCard(N:Doe;John;;;),提取代码示例:

import vobject

# 读取vCard文件
with open("test.vcf", "r") as f:
    vcard = vobject.readOne(f)

# 提取姓、名、中间名
last_name = vcard.n.value.family  # 结果: 'Doe'
first_name = vcard.n.value.given  # 结果: 'John'
middle_name = vcard.n.value.additional  # 结果: ''(测试vCard里中间名部分为空)

print(f"姓: {last_name}")
print(f"名: {first_name}")
print(f"中间名: {middle_name}")

你看到的<N{} John Doe >是Name对象的字符串简化表示,{}内会显示有非空值的属性,后面是名姓的组合展示,方便快速预览,但提取数据必须用上面的标准属性名。

如果中间名存在多个值(比如N字段是N:Smith;Jane;Marie;Ann;;),additional会返回列表格式['Marie', 'Ann'],可以用' '.join()转成字符串:

middle_name = ' '.join(vcard.n.value.additional) if vcard.n.value.additional else ''

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:46:10