整理大量通讯录时,发现从手机上下载的CSV文件不易转成EXCEL文件(QQ通讯录和百度云盘都试过了,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,指定一下便好