Python取出两个文件中相同的电话号码及地址(文件类型为:txt文本)

枫铃3年前 (2021-09-30)Python199

一,准备好要处理的2个文件

1.文件1内容: Person_info1.txt

学员编号    学生姓名    学生年龄    手机号码    E-mail地址    家庭住址
101 张三  18  13599713364 www.zhangsan@qq.com 江苏省苏州市工业园区津梁街
102 李四  20  15923796671 www.lisi.163.com    北京市朝阳区西北路石井街22103 赵五  17  18655301183 www.zhaofive.yahoo.com  山东省烟台市芝罘区北大街55104 tony    30  15877563321 www.tonyliu.ibm.com 江苏省苏州市姑苏区山塘街177105 马云  47  15977560013 www.mayun.alibaba.com   浙江省杭州市西湖路1101888
106 Jack    20  13677569901 www.jack123@qq.com  广东省深圳市南山区西丽159212
107 tom 19  18622349971 www.tom456@qq.com   山东省青岛市人民路1234

2.文件1内容: Person_info2.txt

学员编号    学生姓名    学生年龄    手机号码    E-mail地址    家庭住址
101 liupeng 18  13598717364 www.liupeng@qq.com  江苏省苏州市工业园区津梁街
102 小明  20  15923456767 www.xiaoming.163.com    北京市朝阳区西北路石井街22103 小李  17  18655301183 www.xiaoli.yahoo.com    山东省烟台市芝罘区北大街56104 tony    30  15872356331 www.tonyliu.ibm.com 江苏省苏州市姑苏区山塘街188105 马云  47  15977560013 www.mayun.alibaba.com   浙江省杭州市西湖路1101888
106 Jack    20  13677569812 www.jack123@qq.com  广东省深圳市南山区西丽1435107 bob 19  18622284971 www.bob456@qq.com   山东省青岛市人民路1257

二,编写代码:

思路:

(1)通过正则表达式提取文本中的内容

(2)电话号码为11位数字,第一位肯定是1,第二位必定包含在35678这几个数字中,固定好前2位之后的9位只要匹配到全部是数字即可

(3)匹配住址因为全部是字符串,所以需要找2个文件中地址的共通性,出了北京市是已市开头外其他的都是…省来起始的所以可以把 …省…市作为一个共通点来匹配

另外再建立一个起始 …市开始的字段匹配到北京市就可以了。接下来把第一个匹配跟第二个匹配合并就是我们想要的结果

代码呈现

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import os  #导入OS模块便于对系统本身的命令调用(文件操作)
import re  #导入re模块用于正则表达式

#获取手机号码  (创建获取手机号码方法)
def get_moblie(path):
    pattern = re.compile(R"[1][35678]\d{9}") #正则表达式获取文本中的手机号码
    if not os.path.isfile(path):
        return Exception #如果不是文件就抛出异常
    else:
        try:
            with open(path,"r") as fd: # "r"为只读模式。 with关键字打开文件(with关键字的使用可以规避close方法自动关闭)。fd为赋值变量
                file_data = fd.read() #读取文件中所有内容
        except Exception as e:
            raise e
        mobile_list = pattern.findall(file_data) #定义一个list接收获取到的手机号码
        return mobile_list

# 获取家庭住址
def get_homeaddress(path):
    part01 = re.compile(r".\w省市*\w*") #为什么要创建2个part上面描述中已经解释参照上述描述
    part02 = re.compile(r".\w市区*\w*")
    if not os.path.isfile(path):
        return Exception #如果不是文件就抛出异常
    else:
        try:
            with open(path,"r") as fd:
                file_data = fd.read()
        except Exception as e:
            raise e
        home_address = part01.findall(file_data) #定义一个list接收获取到的家庭住址(包含省份的)
        home_address02 = part02.findall(file_data)#获取到北京市起始的家庭住址
        home_address.append(home_address02[1]) #两个list内容合并home_address02[1]代表只提取北京市起始的字符串
        return home_address

if __name__ == "__main__":
    path01 = R"C:\Users\Administrator\Demo02\Person_info01.txt"
    path02 = R"C:\Users\Administrator\Demo02\Person_info02.txt"

    #案例1: 遍历path01中的手机号码是否在path02中存在.
    file_mobile01 = []
    file_mobile02 = []
    try:
        file_mobile01 = get_moblie(path01)
        file_mobile02 = get_moblie(path02)
    except Exception as e:
        print("获取到的手机号码出现异常")
    set01 = set() # 去除重复的手机号码
    for mobile in file_mobile01:
        if mobile in file_mobile02:
            set01.add(mobile)

    print("<<两个文件中相同的手机号码为>>:",end="\t")
    for i in set01:
        print(i,end=" ")
    print()
print("========================================================================")
homeaddress01 = get_homeaddress(path01)
homeaddress02 = get_homeaddress(path02)

#通过set集合的交集来得出相同的住址信息
setintersection = set(homeaddress01) & set(homeaddress02)
#set(homeaddress01).intersection(set(homeaddress02)) #方法同上
#print("<<两个文件中相同的家庭住址为>>:",setintersection)

print("<<两个文件中相同的家庭住址为>>:")
for i in setintersection:
    print(i)

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。