【Python办公】如何十几行代码,批量提取文本中的几十万个手机号码? 您所在的位置:网站首页 python中怎样逆序输出 【Python办公】如何十几行代码,批量提取文本中的几十万个手机号码?

【Python办公】如何十几行代码,批量提取文本中的几十万个手机号码?

2023-05-29 23:03| 来源: 网络整理| 查看: 265

某天,老板给你布置了个任务,要求如下:

从一个文本文件中,提取散落分布其中的所有手机号码。

你若不会编程,估计就会这么干:把txt文本打开,然后Ctrl+F,搜索数字“1”——因为你知道,手机号码都是从“1”开头。你觉得自己还挺聪明的?然鹅,如果文本中的数字很零散的话,找1效率也是极低的。

无论如何,你准备要大展拳脚了。

要是任务量小,比如几千行的文本,几百个手机号码。无非就是麻烦一点,你吭哧吭哧搞了一两个小时还是弄完了,但是由于纯手工操作,难免心有点虚,有点担心有所遗漏。

但是,如果文本的行数超过百万,提取的号码超过20万个——这,你就傻眼了吧?

总行数超过100万的text文本文件

还好,有Python,天无绝人之路!

接下来,我们就逐步实现完成这个任务。

第一步,定义读取文本文档的函数:

这里头部是一些准备的代码。IDE使用的是Python数据分析常用的Spyder(和RStudio非常类似,我有文章进行过上手介绍)。

# -*- coding: utf-8 -*- """ Created on Tue Jun 29 22:08:03 2021 @Software: Spyder @author: 盲区行者王 """ import os ##准备工作 import re def read_text(text_path): file = open(text_path, encoding="utf-8") data = file.read() file.close() return data data = read_text(r"D:\Python\text\1.txt")

从1.txt这个百万行的文本文件中提取出文本之后,让我们输出看看什么效果。

data ##篇幅太长,只展示部分结果 Out[4]: '\n首发于\n速读一本好书\n写文章\n\n【速读】《Educated - A MEMOIR / 你当像鸟飞往你的山》从没上过一天学到剑桥博士\n【速读】《Educated - A MEMOIR / 你当像鸟飞往你的山》从没上过一天学到剑桥博士\n盲区行者王\n盲区行者王\n\u200b\n北京大学 计算机技术硕士\n碰巧拿到了这本书,是于2018年在美国出版的英文版,作者是Tara Westover。\n\n\nTara Westover,生于1986年\n该书也被比尔·盖茨称为他2018年“最喜欢的5本书之一”。\n\n\n书的封面是一支笔,象征着教育 Education\n\n中文版,豆瓣8.8分\n书的正面说:\n18812345678\n这是一本NYT排第一的畅销书——这里第一是指,曾经登顶过销售榜两三周。\n作者叫 Tara Westover,塔拉·韦斯特弗\n右上角《VOGUE》的述评:“美丽而且振奋

第二步,利用正则表达式,从上一步的文本信息中提取手机号码。

我们从上一步读取出来的data中,利用正则表达式,提取其中的11位手机号码。

## 基于正则表达式,提取手机号码 def get_phonen(data): ##定义手机号码提取函数 ## 基于正则表达式的findall函数 ## 正则表达式的写法新手不用纠结,直接复制粘贴拿去用就是 numbers = re.findall(r'(1\d{10})', data) return numbers

运行并查看结果。这里我们用的是一个简化版的文本文档,其中只包含了3个手机号码。

numbers = get_phonen(data) numbers ## list 列表型的变量 Out[22]: ['18812345678', '18811111111', '18822222222']

第三步,保存提取好的手机号码:## 保存提取的手机号码 def save_phonen(numbers, save_path): save_file = open(save_path, 'w') ##打开存储的本文文件,write模式 for phone in numbers: #print(phone) save_file.write(phone) save_file.write('\n') ##写入一个换行符,一个手机号码一行 ## 在保存手机号码的文档输入以下内容 save_file.write('\n\n手机号码总数: ' + str(len(numbers))) save_file.close() ## 程序运行后,输出以下内容 print("提取完成。手机号码总数: " + str(len(numbers)))第四步,输入原始文件和输出保存文件的路径:## 输入文件路径 text_path = input("请输入文本文件路径:") ## 如果输入的文本文档不存在,则Python会自动新建一个 save_path = input ("请输入号码保存文件路径:") ## 运行程序,共3个函数 save_phonen(get_phonen(read_text(text_path)) , save_path)

接下来,让我们在Spyder中,实际运行一下以上代码,在一个超过100万行的文本文档中提取20多万个手机号码。

为了演示代码运行的情况,我们加了一个print语句,将中间的结果打印出来。现实运行中,为了提高速度,这个print语句记得别加。

打印中间结果

运行成功!最终提取的手机号码如下,共耗时不到5秒:

提取的号码结果

完整的代码如下:

# -*- coding: utf-8 -*- """ Created on Tue Jun 29 21:38:09 2021 @Software: Spyder @author: 盲区行者王 """ import os ##导入可能用到的库 import re ## 定义文本读取函数 def read_text(text_path): file = open(text_path, encoding="utf-8") data = file.read() file.close() return data data = read_text(r"D:\Python\text\1 - 副本.txt") data ##data是一个字符串型(str)的变量 ## 基于正则表达式,提取手机号码 def get_phonen(data): ##定义手机号码提取函数 ## 基于正则表达式的findall函数 ## 正则表达式的写法新手不用纠结,直接复制粘贴拿去用就是 numbers = re.findall(r'(1\d{10})', data) return numbers numbers = get_phonen(data) numbers ## list 列表型的变量 ## 保存提取的手机号码 def save_phonen(numbers, save_path): save_file = open(save_path, 'w') ##打开存储的本文文件,write模式 for phone in numbers: #print(phone) save_file.write(phone) save_file.write('\n') ##写入一个换行符,一个手机号码一行 ## 在保存手机号码的文档输入以下内容 save_file.write('\n\n手机号码总数: ' + str(len(numbers))) save_file.close() ## 程序运行后,输出以下内容 print("提取完成。手机号码总数: " + str(len(numbers))) ## 输入文件路径 text_path = input("请输入文本文件路径:") ## 如果输入的文本文档不存在,则Python会自动新建一个 save_path = input ("请输入号码保存文件路径:") ## 运行程序,共3个函数 save_phonen(get_phonen(read_text(text_path)) , save_path)

下面推荐几本Python几本入门的自动化办公书籍,小白也能学到飞起~

-----全文结束-----



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有