Board logo

标题: [原创代码] python读取安卓通讯录文件(.VCF)联系人 [打印本页]

作者: 523066680    时间: 2013-6-10 19:20     标题: python读取安卓通讯录文件(.VCF)联系人

本帖最后由 523066680 于 2013-6-10 19:27 编辑

因为某个手机快要报废了,谷歌通讯录的联系人和sim联系人保存得不太一致,
为了谨慎起见,先导出了vcf 复制到电脑上,一看,ID部分都是UTF-8编码,无法直视。
所以试着写了python读取联系人信息,并转换UTF-8部分为文字。

以下是google_contact.txt.vcf的部分段落
  1. BEGIN:VCARD
  2. VERSION:2.1
  3. N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=85=B0=E6=A0=BC;=E8=82=96;;;
  4. FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E5=85=B0=E6=A0=BC=20=E8=82=96
  5. TEL;VOICE;PREF:1-352-013-0000
  6. END:VCARD
  7. BEGIN:VCARD
  8. VERSION:2.1
  9. N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E9=98=BF=E5=87=AF=32=30=30=39;;;
  10. FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E9=98=BF=E5=87=AF=32=30=30=39
  11. TEL;VOICE;PREF:1-234-567-8900
  12. END:VCARD
  13. BEGIN:VCARD
  14. VERSION:2.1
  15. N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;=E7=A7=91=E6=8A=80=E6=B3=A2;;;
  16. FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=E7=A7=91=E6=8A=80=E6=B3=A2
  17. TEL;VOICE;PREF:1-328-354-0000
  18. END:VCARD
复制代码


代码:
  1. # -*- coding: cp936 -*-
  2. '''
  3. code by vicyang
  4. paktcmail@gmail.com
  5. 2013-03-01
  6.   将联系人存储到字典,三种情况:
  7.   有电话无联系人、有联系人没有电话、联系人名字相同
  8. '''
  9. def utf2unichr(brr):
  10.     binstr=brr[0][4:]
  11.     for i in range(1,len(brr)):
  12.         binstr=binstr+(brr[i][2:])
  13.     return unichr(int(binstr,2))
  14.         
  15. def analyse(arr):
  16.     for i in range(len(arr)):
  17.         arr[i]=bin(eval("0x"+arr[i]))[2:]   #[2:]去掉 "0b"
  18.         dst=""
  19.     for i in range(len(arr)):
  20.         if (int(arr[i],2)<int("10000000",2)):   #ASCII char
  21.             dst=dst+chr(int(arr[i],2))
  22.         elif (arr[i][:4]=='1110'):
  23.             dst=dst+utf2unichr(arr[i:i+3])      #i,i+1,i+2
  24.         elif (arr[i][:2]=='10'):
  25.             pass
  26.         else:
  27.             print "something worng,%s"%arr[i]
  28.     return dst
  29.    
  30. import re
  31. spec="FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:="
  32. f=open("google_contact.txt",'r')
  33. cnt=-1
  34. array=[]
  35. for i in f:
  36.     if "BEGIN:" in i:
  37.         cnt+=1
  38.         array.append({})
  39.     if re.search("^FN",i):
  40.         s=i.strip("\n")
  41.         if "FN;" in i:
  42.             s=s.replace(spec,"")
  43.             s=s.split("=")
  44.             name=analyse(s)
  45.         elif "FN:" in i:
  46.             name=s.replace("FN:","")
  47.         else:
  48.             print "something wrong!%s"%i
  49.         array[cnt]['name']=name
  50.         
  51.     if "TEL;" in i:
  52.         s=i.strip("\n")
  53.         s=re.sub("TEL;.*;PREF:","",s)
  54.         PhoneCode=re.sub("-","",s)
  55.         array[cnt]["tel"]=PhoneCode
  56. for i in range(len(array)):
  57.     if "name" in array[i]:
  58.         print array[i]['name']
  59.     else:
  60.         pass
  61.     if "tel" in array[i]:
  62.         print array[i]['tel']
  63.     else:
  64.         pass
  65. raw_input()
  66. f.close()
复制代码
显示结果:
兰格 肖
13520130000
阿凯2009
12345678900
科技波
13283540000


本想写成对比两个通讯录的异同之处,搁置了
作者: Python    时间: 2013-6-13 10:28

vicyang是谁?
作者: 523066680    时间: 2013-6-13 21:32

vicyang是谁?
Python 发表于 2013-6-13 10:28



    姓杨,vic英文名
作者: codegay    时间: 2016-1-6 11:16

咦,还能写得一手python
作者: 523066680    时间: 2016-1-7 12:42

回复 4# codegay


    忘光了,以前不懂编码,浪费了很多表情




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2