使用python和re-library读取vcf文件数据

2024-04-26 03:43:10 发布

您现在位置:Python中文网/ 问答频道 /正文

以下是.vcf文件数据中的内容。在

BEGIN:VCARD
VERSION:4.0
N:Muller;CCCIsabella;;;
FN:Muller
ORG:Bubba Gump Shrimp Co.
TITLE:Shrimp Man
PHOTO;MEDIATYPE=image/gif:http://www.example.com/dir_photos/my_photo.gif
TEL;TYPE=work,voice;VALUE=uri:tel:+16829185770
REV:20080424T195243Z
END:VCARD

BEGIN:VCARD
VERSION:4.0
N:Mraz;CCCEdwardo;;;
FN:Mraz
ORG:Bubba Gump Shrimp Co.
TITLE:Shrimp Man
PHOTO;MEDIATYPE=image/gif:http://www.example.com/dir_photos/my_photo.gif
TEL;TYPE=work,voice;VALUE=uri:tel:+18083155095
REV:20080424T195243Z
END:VCARD

BEGIN:VCARD
VERSION:4.0
N:Reynolds;CCCBrant;;;
FN:Reynolds
ORG:Bubba Gump Shrimp Co.
TITLE:Shrimp Man
PHOTO;MEDIATYPE=image/gif:http://www.example.com/dir_photos/my_photo.gif
TEL;TYPE=work,voice;VALUE=uri:tel:+15089473508
REV:20080424T195243Z
END:VCARD

我想要我的数据如下。在

^{pr2}$

但我没有得到上述数据。在这种情况下请帮帮我。这里我用re-python包来解决。在

import re
file = open('contacts.vcf', 'r')
contacts = []
for line in file:
    name = re.findall('FN:(.*)', line)
    tel = re.findall('tel:(.*)', line)
    nm = ''.join(name)
    tel = ''.join(tel)
    if len(nm) == 0 and len(tel) == 0:
        continue
    data = {'name' : nm, 'phone' : tel}
    contacts.append(data)
print(contacts)

得到以下结果姓名和电话是不同的添加。在

[{'name': 'Muller', 'phone': ''}, {'name': '', 'phone': '+16829185770'}, {'name': 'Mraz', 'phone': ''}, {'name': '', 'phone': '+18083155095'}, {'name': 'Reynolds', 'phone': ''}, {'name': '', 'phone': '+15089473508'}]

Tags: 数据nameorgreversionphonegifvcard
2条回答

通常在调试时,在不同的点使用print来找出代码出了什么问题。例如,如果在tel = ''.join(tel)之后插入print(">",nm,tel),则应该得到以下输出:

>  
>  
>  
> Muller 
>  
>  
>  
>  +16829185770
>  
>  
>  
>  
>  
>  
> Mraz 
>  
[... continued...]

显然,这是因为您的for循环是在文件中的每一行上操作的,而不是每个卡(从技术上讲,您甚至承认这一点:for line in file:)。在

您可能有兴趣使用一个模块来解析这个文件(一个快速的google启动了vobject包),这将消除对re的需要。如果你有雄心壮志,你可以手动解析它(对格式不太熟悉,所以这里有一个即兴的例子)。在

^{pr2}$

同样,我对这段代码没有任何保证,因为我不会查找vcf格式的所有规范,并建议使用专门为此设计的模块。在

您可以尝试下面的代码。在

import re
file = open('vcards-2.vcf', 'r')
contacts = []
phone = []
for line in file:
    name = re.findall('FN:(.*)', line)
    nm = ''.join(name)
    if len(nm) == 0:
        continue

    data = {'name' : nm.strip()}
    for lin in file:
        tel = re.findall('pref:(.*)', lin)
        tel = ''.join(tel)

        if len(tel) == 0:
            continue

        tel = tel.strip()
        tel = ''.join(e for e in tel if e.isalnum())
        data['phone'] = tel
        break
    contacts.append(data)

print(contacts)

你会得到以下结果

^{pr2}$

相关问题 更多 >