Python取出两个文件中相同的电话号码及地址(文件类型为:txt文本)
一,准备好要处理的2个文件
1.文件1内容: Person_info1.txt
学员编号 学生姓名 学生年龄 手机号码 E-mail地址 家庭住址
101 张三 18 13599713364 www.zhangsan@qq.com 江苏省苏州市工业园区津梁街
102 李四 20 15923796671 www.lisi.163.com 北京市朝阳区西北路石井街22幢
103 赵五 17 18655301183 www.zhaofive.yahoo.com 山东省烟台市芝罘区北大街55号
104 tony 30 15877563321 www.tonyliu.ibm.com 江苏省苏州市姑苏区山塘街177号
105 马云 47 15977560013 www.mayun.alibaba.com 浙江省杭州市西湖路110号1888
106 Jack 20 13677569901 www.jack123@qq.com 广东省深圳市南山区西丽1592幢12
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 北京市朝阳区西北路石井街22幢
103 小李 17 18655301183 www.xiaoli.yahoo.com 山东省烟台市芝罘区北大街56号
104 tony 30 15872356331 www.tonyliu.ibm.com 江苏省苏州市姑苏区山塘街188号
105 马云 47 15977560013 www.mayun.alibaba.com 浙江省杭州市西湖路110号1888
106 Jack 20 13677569812 www.jack123@qq.com 广东省深圳市南山区西丽1435幢
107 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)