【PYTHON小项目】VCF文件转EXCEL文件方法详解(附QUOTED-PRINTABLE编解码)

来源

整理大量通讯录时,发现从手机上下载的CSV文件不易转成EXCEL文件(QQ通讯录和百度云盘都试过了,CSV文件过大无法加载),导致整理起来特别麻烦,故试图自己写一个小程序来处理文件。

分析CSV文件

用文本编辑器打开vcf一看,就是文本格式,我只需要把它转换成csv格式,然后就可以导入到Excel中了

BEGIN:VCARD
VERSION:2.1
N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=95=8A=6C;;;;
FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=95=8A=6C
LATESTDATE:201909011513
COUNTRYISO:TH
OPPO_RECENT_CALL:NULL
TEL;CELL:83834033
X-OPPO-GROUP;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=51=51=E5=90=8C=E6=AD=A5=E5=8A=A9=E6=89=8B=32=30=31=36=31=30=30=31
END:VCARD

从内容看,只需要取"FN:"、"TEL"打头的字段,遇到"END"再开始下一个名片。
由FN观察得知,其编码为QUOTED-PRINTABLE,故可引入quopri模块来解码。

代码

import quopri       #quoted-printable编解码
with open("I:\contacts.vcf", 'r') as rf, open('I:\contacts.txt', 'w',encoding='utf-8') as wf:
    content = ['', '', '', '']
    tel = 0
    not_1_line=0
    fn=''               #多行姓名
    for line in rf.readlines():      
        if line.startswith('FN') or not_1_line:      #姓名   此处存在多行的情况
            if len(line)>1:
                if line[-2]=='=': #说明不止1行 
                    not_1_line=1
                    fn+=line[:-2]       #删除最后两位——'=\n'
                    continue
                else:               #到底了
                    not_1_line=0
            fn+=line.strip('\n')
            line=fn
            fn=''       #清空
            pos=line.find(':')  
            qp_origin= line[pos+1:].strip().encode()      #b'=E5=95=8A=6C'     
            content[0]=quopri.decodestring(qp_origin).decode('utf-8')

        elif line.startswith('TEL'):
            if tel > 2:                 #最多三个电话
                continue
            pos = line.find(':')
            content[tel + 1] = line[pos + 1:].strip()
            tel = tel + 1
        elif line.startswith('END'):
            str = '\t'.join(content) + '\n'      #'gbk' codec can't encode character '\u270c' in position 5: illegal multibyte sequence,存在特殊字符
                                                #将编码方式修改为UTF-8——open默认编解码非utf-8
            if '筛选条件' in str:                #此处添加筛选条件
                wf.write(str)
            content = ['', '', '', '']
            tel = 0

总结

此程序主要难点就是编码的转换。
此外,FN有时会超过两行或者三行,必须要特别考虑,不然会出现无法解码的情况
转换出来的为txt文件,若需要excel文件,直接全选复制便可

错误

'gbk' codec can't encode character '\u270c' in position 5: illegal multibyte sequence
调试中遇到如上错误,经过排查是缘由open默认编码非utf-8,指定一下便好

你可能感兴趣的:(python)