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

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

一,准备好要处理的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面试题40问

Python面试题40问

**1)什么是Python?**使用Python有什么好处? Python是一种编程语言,包含对象&...

python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例)

模式可做操作若文件不存在是否覆盖r只能读报错-r+可读可写报错是w只能写创建是w+可读可写创建是a只能写创建否,追加写a+...

Python的__getattribute__ vs __getattr__的妙用

这里的属性即包括属性变量...

python 各种推导式玩法

推导式套路 除了最简单...

python中json.dumps和json.loads,get和post

python中json.dumps和json.loads,get和post

一、json.dumps()和json.loads()概念理解 1、json.dumps()和json.loads()是json格式处理函数(...

python函数后面有多个括号怎么理解?

一般而言,函数后面只有一个括号。如果看见括号后还有一个括号,说明第一个函数返回了一个函数,如果后面还有括号ÿ...

发表评论

访客

看不清,换一张

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