如何用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
相关产品推荐
相关产品推荐

