python实现批量添加联系人到手机通讯录+python可视化编程案例

简要
本案例通过python+pandas实现提取excel工作表中的数据,并将其添加相关代码信息,再保存为txt,然后保存为后缀名为.vcf的通讯录备份文件,此文件可以直接使用手机自带通讯录软件打开(安卓苹果通用),然后将文件内信息导入到手机通讯录中。
具体操作界面如下所示:python实现批量添加联系人到手机通讯录+python可视化编程案例_第1张图片
模板表格
python实现批量添加联系人到手机通讯录+python可视化编程案例_第2张图片

前期思路
1、首先使用手机通讯录备份功能,备份一个通讯录出来,然后用txt打开并研究其代码结构。
用txt打开后如下图所示
.vcf.文件图标
python实现批量添加联系人到手机通讯录+python可视化编程案例_第3张图片
这是备份了两条通讯录的.vcf用记事本打开后的代码,其原理就显而易见了,每一条记录都由BEGIN:VCARD开始,由END:VCARD结束
我们需要改动的,只是每一块结构的第3、4、5行代码,分别是姓名部分和电话号码部分
2、建立一个模板表格
python实现批量添加联系人到手机通讯录+python可视化编程案例_第4张图片
我所建立的表格如上图所示,简单列了三栏,分别填写通讯录的用户名,联系方式,备注名。
3、程序实现
整体思路就是先读取表格内的数据,然后把备注名和用户名进行组合,再调用联系方式列,套入格式,将其写入一个txt文件中。
为了提高软件的实用性,本实例实现了可视化操作界面,并用pip打包,便于没有安装python环境的朋友进行使用。

程序编写
一、库函数

import pandas as pd
import os
import time
from tkinter import *
import tkinter.filedialog

首先是调用pandas库函数,这个是用于excel的读取,pandas不仅仅有读取功能,还有强大的excel表格处理能力
os库是总所周知了,他是python内部的一个函数库,学过python的同学们都知道,这个是比较基础的python操作函数,没学过没关系,附教程书地址:https://www.runoob.com/python3/python3-os-file-methods.html
time库用于调用系统时间,便于生成文件命名,确保文件不重复
tkinter库是用于实现python可视化人机交互界面,功能丰富,搞这个小项目足够了,学习地址:https://www.jianshu.com/p/91844c5bca78
二、函数编写
1、获取时间

# 格式化成200814-005100形式
time = time.strftime("%y%m%d-%H%M%S", time.localtime())

2、可视化界面程序编写

#可视化界面程序编写

root = Tk()
root.title('py快速生成通讯录')
root.geometry('320x240') # 这里的乘号不是 * ,而是小写英文字母 x
lb = Label(root,text='')
lb.pack()
lb = Label(root,text='选择备注方式')
lb.pack()
var = IntVar()
rd1 = Radiobutton(root,text="无备注 例:           “张三”", variable=var, value=0, command=Mysel)
rd1.pack()
rd2 = Radiobutton(root,text="前备注 例:“备注名-张三”", variable=var, value=1, command=Mysel)
rd2.pack()
rd3 = Radiobutton(root,text="后备注 例:“张三-备注名”", variable=var, value=2, command=Mysel)
rd3.pack()
btn=Button(root, text='选择文件', command=xz)
btn.place(relx=0.2, rely=0.7)
lb.pack()
btClose=Button(root,text='关闭',command=root.destroy)
btClose.place(relx=0.7,rely=0.7)
root.mainloop()

3、显示备注方式函数

def Mysel():#显示备注方式
    dic = {
     0: '无备注', 1: '前备注', 2: '后备注'}
    s = "当前是 " + dic.get(var.get()) + " 项"
    lb.config(text=s)#显示在主窗口

4、选择文件

def xz():#可视化界面选择文件


    filename=tkinter.filedialog.askopenfilename()#获取文件名及文件目录
    if filename[-4:] == '.xls' or filename[-5:] == '.xlsx':#判断是否是excel文件
        lb.config(text='通讯录文件已保存到原目录')
        run(filename)
    else:
        lb.config(text='您没有选择任何文件')

5、数据处理函数

def run(filedir):#本函数用于把excel中的数据匹并生成通讯录文件
    older_path, file_name = os.path.split(filedir) # 分离文件地址与文件名
    data = pd.read_excel(filedir)  # 打开原始工作表
    rows = data.shape[0]  # 获取行数 shape[0]获取行数
    txtName = older_path + "\\phonenumbers.txt" #在本目录下新建临时文件的文件名
    f = open(txtName, mode='w')#先建临时文件
    for i in range(1, rows):#遍历每一行
        if var.get() == 0:          #判断选择备注方式(无备注)
            name = str(data.iloc[i, 0])#从excel获取姓名
        elif var.get() == 1:        #判断选择备注方式(前备注)
            name = str(data.iloc[i, 2]) + '-' + str(data.iloc[i, 0])
        elif var.get() == 2:        #判断选择备注方式(后备注)
            name = str(data.iloc[i, 0]) + '-' +str(data.iloc[i, 2])
        phonenum = str(data.iloc[i, 1])#从excel获取电话号码
        if len(phonenum) == 11:#判断电话号码是否是11位电话号码,然后执行格式变换
            new_context = "BEGIN:VCARD\n" \
                          + "VERSION:3.0\n" \
                          + "N;CHARSET=gb2312:" + str(name) + '\n' \
                          + "FN;CHARSET=gb2312:" + str(name) + "\n" \
                          + "TEL;TYPE=CELL:" + str(phonenum) + '\n' \
                          + "END:VCARD\n"#写入数据
            f.write(new_context)#写入txt文件
    f.close()#关闭并保存txt
    os.rename(older_path + '\\phonenumbers.txt', older_path + '\\' + time + '.vcf')#文件重命名,将后缀名改为.vcf

程序打包
pip installer是一个比较完善的python程序打包工具,该工具实现了python例程能够在任何windows系统上运行,即便是另外的电脑并没有安装python环境。
pip installer使用方法可以参考以下文章https://blog.csdn.net/m0_37149062/article/details/106985304
完整代码

import pandas as pd
import os
import time
from tkinter import *
import tkinter.filedialog

# 格式化成200814-005100形式
time = time.strftime("%y%m%d-%H%M%S", time.localtime())

def run(filedir):#本函数用于把excel中的数据匹并生成通讯录文件
    older_path, file_name = os.path.split(filedir) # 分离文件地址与文件名
    data = pd.read_excel(filedir)  # 打开原始工作表
    rows = data.shape[0]  # 获取行数 shape[0]获取行数
    txtName = older_path + "\\phonenumbers.txt" #在本目录下新建临时文件的文件名
    f = open(txtName, mode='w')#先建临时文件
    for i in range(1, rows):#遍历每一行
        if var.get() == 0:          #判断选择备注方式(无备注)
            name = str(data.iloc[i, 0])#从excel获取姓名
        elif var.get() == 1:        #判断选择备注方式(前备注)
            name = str(data.iloc[i, 2]) + '-' + str(data.iloc[i, 0])
        elif var.get() == 2:        #判断选择备注方式(后备注)
            name = str(data.iloc[i, 0]) + '-' +str(data.iloc[i, 2])
        phonenum = str(data.iloc[i, 1])#从excel获取电话号码
        if len(phonenum) == 11:#判断电话号码是否是11位电话号码,然后执行格式变换
            new_context = "BEGIN:VCARD\n" \
                          + "VERSION:3.0\n" \
                          + "N;CHARSET=gb2312:" + str(name) + '\n' \
                          + "FN;CHARSET=gb2312:" + str(name) + "\n" \
                          + "TEL;TYPE=CELL:" + str(phonenum) + '\n' \
                          + "END:VCARD\n"#写入数据
            f.write(new_context)#写入txt文件
    f.close()#关闭并保存txt
    os.rename(older_path + '\\phonenumbers.txt', older_path + '\\' + time + '.vcf')#文件重命名,将后缀名改为.vcf

def Mysel():#显示备注方式
    dic = {
     0: '无备注', 1: '前备注', 2: '后备注'}
    s = "当前是 " + dic.get(var.get()) + " 项"
    lb.config(text=s)#显示在主窗口
def xz():#可视化界面选择文件


    filename=tkinter.filedialog.askopenfilename()#获取文件名及文件目录
    if filename[-4:] == '.xls' or filename[-5:] == '.xlsx':#判断是否是excel文件
        lb.config(text='通讯录文件已保存到原目录')
        run(filename)
    else:
        lb.config(text='您没有选择任何文件')

#可视化界面程序编写

root = Tk()
root.title('py快速生成通讯录')
root.geometry('320x240') # 这里的乘号不是 * ,而是小写英文字母 x
lb = Label(root,text='')
lb.pack()
lb = Label(root,text='选择备注方式')
lb.pack()
var = IntVar()
rd1 = Radiobutton(root,text="无备注 例:           “张三”", variable=var, value=0, command=Mysel)
rd1.pack()
rd2 = Radiobutton(root,text="前备注 例:“备注名-张三”", variable=var, value=1, command=Mysel)
rd2.pack()
rd3 = Radiobutton(root,text="后备注 例:“张三-备注名”", variable=var, value=2, command=Mysel)
rd3.pack()
btn=Button(root, text='选择文件', command=xz)
btn.place(relx=0.2, rely=0.7)
lb.pack()
btClose=Button(root,text='关闭',command=root.destroy)
btClose.place(relx=0.7,rely=0.7)
root.mainloop()


打包好的软件下载地址:
https://download.csdn.net/download/qq_39541326/12714006

谢谢观看

你可能感兴趣的:(pandas,python,python,可视化,数据可视化,linux)