有个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() # 退出程序