手机通讯录VCF文件转换Excel格式方法

有个VCF转换器是收费的,作为码农,必须得自己解决
找了一些代码都不好用,那就自己搞一下吧
引用的库自己安装,直接就可以使用

'''
Author: Alfred huqitaoit@gmail.com
Date: 2024-05-08 11:27:00
LastEditors: Alfred
LastEditTime: 2024-05-08 16:25:54
Description: vcf文件转换xsl文件
'''
import quopri
import xlwt
import os
import time

def vcf2xls(vcf_filename, xls_filename):
    file=open(vcf_filename+'.vcf','rb')
    book=xlwt.Workbook(encoding="utf-8",style_compression=0)
    sheet = book.add_sheet('contact', cell_overwrite_ok=True)
    
    people_list = list()
    phone_list = list()
    people_list.append(("姓名",["手机","电话"],"邮箱","地址"))
    for line in file:
        line = str(line,encoding = "utf8")
        if 'BEGIN:VCARD' in line:
            phone_list=list()
            email = address=''
            in_address_field = False
        if 'N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:' in line and 'FN' not in line:
            try:
                name=quopri.decodestring(line[line.index('N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:')+42:line.index(';;;')]).decode()
            except:
                line = line+str(file.readline(),encoding = "utf8")
                name=quopri.decodestring(line[line.index('N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:')+42:line.index(';;;')]).decode()
            name=name.replace(';','')
        if 'ADR;WORK;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:' in line:  
            # 开始解析地址字段  
            in_address_field = True  
            # 跳过标签和可能的空格,只取编码部分  
            address = line.split(':', 1)[1].strip()  
        elif in_address_field:
            #格式要处理一下否则endswith判断不了,字符串可能有空格
            encoded_part = line.strip() 
            if encoded_part.endswith(';;;;'):
                in_address_field = False  
                address+=(line.strip())
                address=address.replace(';','')
                address=address.replace('==','=')
                address=quopri.decodestring(address).decode()
            else:
                address+=(line.strip())
        if 'EMAIL;WORK:' in line:
            email= line[line.index('EMAIL;WORK:')+len('EMAIL;WORK:'):-2]
        if 'EMAIL;PREF;WORK:' in line:
            email= line[line.index('EMAIL;PREF;WORK:')+len('EMAIL;PREF;WORK:'):-2]
        # 如果有其他前缀按下面的方式添加,邮箱应该也同理
        if 'TEL;CELL:' in line:
            phone_list.append(line[line.index('TEL;CELL:')+len('TEL;CELL:'):-2])
        if 'TEL;HOME:' in line:
            phone_list.append(line[line.index('TEL;HOME:')+len('TEL;HOME:'):-2])
        if 'TEL;WORK:' in line:
            phone_list.append(line[line.index('TEL;WORK:')+len('TEL;WORK:'):-2])
        if 'TEL;CELL;PREF:' in line:
            phone_list.append(line[line.index('TEL;CELL;PREF:')+len('TEL;CELL;PREF:'):-2])
        if 'TEL;WORK;PREF:' in line:
            phone_list.append(line[line.index('TEL;WORK;PREF:')+len('TEL;WORK;PREF:'):-2])
        if 'END:VCARD' in line:
            people_list.append((name,phone_list,email,address))

    for i in range(len(people_list)):
        sheet.write(i,0,people_list[i][0])
        for j in range(len(people_list[i][1])):
            sheet.write(i,j+1,people_list[i][1][j])
        sheet.write(i,3,people_list[i][2]) #邮箱
        sheet.write(i,4,people_list[i][3]) #地址
    if xls_filename:
        book.save(xls_filename+'.xls')
    else:
        book.save(vcf_filename+'.xls')

if __name__ == '__main__':
    print(f"注意:要转换的vcf文件需要跟本执行程序在同一目录下")
    vcf_filename = input("请输入vcf文件名称:").strip()
    if not vcf_filename:  # 检查输入是否为空
        vcf_filename = None
        print("未输入vcf文件名称,程序2秒后将退出。")
        time.sleep(2)
        exit()

    xls_filename = input("请输入保存后的xls名称,不输入则使用vcf文件名称:").strip()
    if not xls_filename:  # 如果用户没有输入xls文件名,使用vcf文件名称
        xls_filename = vcf_filename

    if not os.path.exists(vcf_filename+'.vcf'):
        print(f"文件: {vcf_filename}.vcf 不存在,程序2秒后将退出。")
        time.sleep(2)
        exit()
    
    print(f"转换文件:{vcf_filename}.vcf 到 {xls_filename}.xls")
    # vcf_filename = xls_filename= "00001"
    vcf2xls(vcf_filename, xls_filename)
    print("执行完成,按任意键退出...")
    input()  # 用户输入后,程序继续执行
    exit()  # 退出程序
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值