【问题标题】:Won't read multiple vcards from .vcf file, vobject.readOne(f) only works the first vcard不会从 .vcf 文件中读取多个 vcard,vobject.readOne(f) 仅适用于第一个 vcard
【发布时间】:2017-01-04 01:23:57
【问题描述】:
    #!/usr/bin/env python2.7

    import vobject

    abfile='/foo/bar/directory/file.vcf'

    def test_vobject_dot_readOne():
        with open(abfile) as f:
            vcard = vobject.readOne(f)
            vcard = vobject.readOne(f)

    test_vobject_dot_readOne()

上面的代码不起作用,但如果我们删除两个重复语句中的一个,它会起作用。我想一张一张地阅读电子名片。有没有办法用 vobject.readOne(f) 做到这一点?如何从文件中读取 vcard n?

我使用的 vcf 文件取自 google 联系人(导出为 vcard 格式)。这是我在测试中使用的文件内容,只有两个 vcard:

    BEGIN:VCARD 
    VERSION:3.0
    FN:Foo_bar1
    N:;Foo_bar1;;;
    EMAIL;TYPE=INTERNET:foobar1@foo.bar.com
    END:VCARD
    BEGIN:VCARD
    VERSION:3.0
    FN:Foo_bar2 
    N:;Foo_bar2;;;
    EMAIL;TYPE=INTERNET:foobar2@foo.bar.com
    END:VCARD

然后可以使用 Vcard 读数进行比较以避免重复,如另一个问题所示:

To remove vcard contact duplicates, comparing if two vcards are equal in .vcf file does not work with simple == vobject comparison

【问题讨论】:

  • 您能否提供一个我们可以运行的完整示例,以便我们查看您遇到的错误类型?
  • 这是所有代码!!!
  • 我正在使用 pycharm。通过一次调用 vobject.readOne(f) ,上述代码可以正常工作,但两次则不能。我的想法是阅读几个 vcard 并选择满足给定功能的 vcard。您可以通过在每次 readOne 调用后简单地尝试打印 vcard 来测试它。
  • 如果我对我的 cmets 和问题没有任何意义,请告诉我...
  • 代码末尾应该有 test_vobject_dot_readOne() ...只是忘记添加对函数的调用...(我刚刚编辑了问题以反映这一点)

标签: python-2.7 python-3.x vcf-vcard vobject


【解决方案1】:

好吧,希望我能正确理解你想要做什么。

您是否正在尝试做这样的事情?

#!/usr/bin/env python2.7

import vobject

test_vcard_information = r"""BEGIN:VCARD
VERSION:3.0
FN:Foo_bar1
N:;Foo_bar1;
EMAIL;TYPE=INTERNET:foobar1@foo.bar.com
END:VCARD
BEGIN:VCARD
VERSION:3.0
FN:Foo_bar2
N:;Foo_bar2;
EMAIL;TYPE=INTERNET:foobar2@foo.bar.com
END:VCARD
"""

for vcard in vobject.readComponents(test_vcard_information):
    print vcard.fn.value

或者,如果您有文件中的信息:

#!/usr/bin/env python2.7

import vobject

test_filename = r'/path/to/Test_addressbook.vcf'

with open(test_filename) as source_file:
    for vcard in vobject.readComponents(source_file):
       print vcard.fn.value

您可能会将.readOne() 与日历文件 (.ics) 一起使用,因为它将由单个根对象组成,如下例所示:

#!/usr/bin/env python2.7

import vobject

test_calendar_information = r"""BEGIN:VCALENDAR
PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
VERSION:2.0
BEGIN:VTIMEZONE
TZID:America/Toronto
BEGIN:DAYLIGHT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
DTSTART:19701101T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
CREATED:20170104T022518Z
LAST-MODIFIED:20170104T022643Z
DTSTAMP:20170104T022643Z
UID:3fab09d6-59bb-430b-8b21-56c9636871e2
SUMMARY:Write a chapter
CATEGORIES:Projects
DTSTART;TZID=America/Toronto:20170105T140000
DTEND;TZID=America/Toronto:20170105T150000
TRANSP:OPAQUE
X-MOZ-GENERATION:2
LOCATION:At home
DESCRIPTION:One day I will be a great writer but I have to start somewhere...
SEQUENCE:1
END:VEVENT
BEGIN:VEVENT
CREATED:20170104T022346Z
LAST-MODIFIED:20170104T022654Z
DTSTAMP:20170104T022654Z
UID:b304f46a-f533-4aa4-8ee1-3b59649dedfa
SUMMARY:See a movie
CATEGORIES:Entertainment
DTSTART;TZID=America/Toronto:20170103T110000
DTEND;TZID=America/Toronto:20170103T140000
TRANSP:OPAQUE
X-MOZ-GENERATION:4
LOCATION:Somewhere over the rainbow
DESCRIPTION:The Wizard of Oz is movie I haven't seen in a long time.\n\nWe
  should schedule a time to see it
SEQUENCE:1
END:VEVENT
END:VCALENDAR"""

vcalendar = vobject.readOne(test_calendar_information)
for vevent in vcalendar.vevent_list:
    print vevent.summary.value

或者如果它在一个文件中:

#!/usr/bin/env python2.7

import vobject

test_filename = r'/path/to/Test_Calendar.ics'

with open(test_filename) as source_file:
    vcalendar = vobject.readOne(source_file)
    for vevent in vcalendar.vevent_list:
        print vevent.summary.value

【讨论】:

  • 嗨,这很有帮助!有没有办法访问文件中的 vcard 54? (好像 vcards 在一个数组上)
  • 我可以复制阵列上的每个电子名片,然后访问它们,但似乎应该有一个更简单的解决方案......
  • 我想获得有关 vobject 的文档以更好地理解您的代码以及何时使用 readOne(和其他选项),是否有特定的链接可以推荐?为什么 readOne 第二次不能工作? (也许这可以通过您为上一个问题发送的链接来解释。)谢谢!!!
  • 根据您的建议,我在stackoverflow.com/q/41460013/5965670 中发布了后续问题。再次感谢您!
  • 我以前从未与vobject 合作过,所以我不能给你一个明确的答案。我的答案基于online documentation 并进行了试验。但我认为您不能直接访问文件中的 vcard,例如数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多