背景和目标

这次我想要处理的是一个txt文件,里面的内容是一台机器定时ping另一台机器的输出结果,想要提取出的内容是时间和rtt值,最后还要把结果输出到csv文件。

1. 明确要提取的内容,编写正则表达式

要提取的文本如下:

第一步是要编写正则表达式,此时可以先不要读取数据文件。先复制一部分数据到str中,方便测试。
编写正则表达式用到了re模块,因为每个人要处理的文本是不一样的,所以需要自己去学习基本的使用方法。re具体使用方法可以参考这篇文章:
https://zhuanlan.zhihu.com/p/139596371

关键就是弄清楚.*?{}的作用,还有re.S可以匹配到换行符,就可以比较容易地写出正确的表达式。

import re
# 为了方便测试,我把一部分文本先放到str里
str='''
2022-03-11 15:21:48
1
PING 81.71.51.181 (81.71.51.181) 56(84) bytes of data.
64 bytes from 81.71.51.181: icmp_seq=1 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=2 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=3 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=4 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=5 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=6 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=7 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=8 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=9 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=10 ttl=45 time=253 ms--- 81.71.51.181 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9000ms
rtt min/avg/max/mdev = 250.203/250.563/253.202/0.961 ms
2022-03-11 15:22:40
2
PING 81.71.51.181 (81.71.51.181) 56(84) bytes of data.
64 bytes from 81.71.51.181: icmp_seq=1 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=2 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=3 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=4 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=5 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=6 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=7 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=8 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=9 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=10 ttl=45 time=250 ms--- 81.71.51.181 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9009ms
rtt min/avg/max/mdev = 250.181/250.256/250.434/0.636 ms
2022-03-11 15:23:44
3
PING 81.71.51.181 (81.71.51.181) 56(84) bytes of data.
64 bytes from 81.71.51.181: icmp_seq=1 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=2 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=3 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=4 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=5 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=6 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=7 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=8 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=9 ttl=45 time=250 ms
64 bytes from 81.71.51.181: icmp_seq=10 ttl=45 time=250 ms--- 81.71.51.181 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9009ms
rtt min/avg/max/mdev = 250.209/250.320/250.658/0.563 ms
'''# print(re.findall(r'(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2})', str))  # 提取时间
# print(re.findall(r'mdev = (.*?) ms', str))  # 提取rttprint(re.findall(r'(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}).*?mdev = (.*?) ms', data, re.S))  # 提取时间和rtt 包括换行

输出:

D:\python37\python.exe D:/test/data_process.py
['2022-03-11 15:21', '2022-03-11 15:22', '2022-03-11 15:23']
['250.203/250.563/253.202/0.961', '250.181/250.256/250.434/0.636', '250.209/250.320/250.658/0.563']
[('2022-03-11 15:21', '250.203/250.563/253.202/0.961'), ('2022-03-11 15:22', '250.181/250.256/250.434/0.636'), ('2022-03-11 15:23', '250.209/250.320/250.658/0.563')]Process finished with exit code 0

2. 从文件中读入数据

编写出正确的正则表达式后,就可以从文件中读数据了

import re
# 读取文件
with open("ping/ping_flkf_gz.txt","r") as input_file:str = input_file.read()print(re.findall(r'(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}).*?mdev = (.*?) ms', str, re.S))  # 提取时间和延迟 包括换行input_file.close()  # 关闭文件

输出比较多,截取一部分展示:

D:\python37\python.exe D:/test/data_process.py
[('2022-03-11 15:21', '250.203/250.563/253.202/0.961'), ('2022-03-11 15:22', '250.181/250.256/250.434/0.636'), ('2022-03-11 15:23', '250.209/250.320/250.658/0.563'), ('2022-03-11 15:25', '250.183/250.240/250.275/0.225'), ('2022-03-11 15:26', '250.217/250.240/250.300/0.592'), ('2022-03-11 15:27', '250.166/250.362/250.956/0.683'), ('2022-03-11 15:28', '250.186/250.256/250.343/0.319'), ('2022-03-11 15:29', '250.181/250.435/252.077/0.776'), ('2022-03-11 15:30', '250.177/250.249/250.401/0.673'), ('2022-03-11 15:31', '250.210/250.436/251.498/0.376'), ('2022-03-11 15:32', '250.207/250.280/250.588/0.401'), ('2022-03-11 15:33', '250.237/250.336/250.747/0.568'), ('2022-03-11 15:34', '250.217/250.283/250.437/0.675'), ('2022-03-11 15:35', '250.254/250.456/251.092/0.623'), ('2022-03-11 15:36', '250.167/250.236/250.308/0.226'), ('2022-03-11 15:37', '250.162/250.399/251.032/0.667'), ('2022-03-11 15:38', '250.207/250.261/250.406/0.053'), ('2022-03-11 15:39', '250.219/250.657/252.056/0.878')]

这里其实是一个列表,里面的每个元组是我提取出来的时间和rtt。

3. 写入csv

能够正确读取输入文件并提取数据后,下一步就是要把结果写入csv文件,所以用到了csv模块。
for循环遍历列表,使用csv_writer.writerow一行行写入csv文件。

import re
import csv# 读取文件
with open("ping/ping_flkf_gz.txt", "r") as input_file:str = input_file.read()# 用一个列表接收提取出来的数据
list = re.findall(r'(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}).*?mdev = (.*?) ms', str, re.S)  # 1.创建文件对象
output_file = open('res/ping/ping_flkf_gz.csv', 'w', encoding='utf-8', newline='')
# 2.基于文件对象构建csv写入对象
csv_writer = csv.writer(output_file)
# 3. 写入表头
csv_writer.writerow(["time", "latency"])
# 4.遍历列表,写入csv文件
for i in list:csv_writer.writerow([i[0], i[1]])input_file.close()  # 关闭文件
output_file.close()  # 关闭文件

结果就写入到csv文件中了

time,latency
2022-03-11 15:21,250.203/250.563/253.202/0.961
2022-03-11 15:22,250.181/250.256/250.434/0.636
2022-03-11 15:23,250.209/250.320/250.658/0.563
2022-03-11 15:25,250.183/250.240/250.275/0.225
2022-03-11 15:26,250.217/250.240/250.300/0.592
2022-03-11 15:27,250.166/250.362/250.956/0.683
2022-03-11 15:28,250.186/250.256/250.343/0.319
2022-03-11 15:29,250.181/250.435/252.077/0.776
2022-03-11 15:30,250.177/250.249/250.401/0.673
2022-03-11 15:31,250.210/250.436/251.498/0.376

4. 还可以把每个数值分开存放

发现此时latency那一列是这样的250.203/250.563/253.202/0.961
为了后面方便处理,把每个数值单独作为一列,因此要修改正则表达式

import re
import csv# 读取文件
with open("ping/ping_flkf_gz.txt", "r") as input_file:str = input_file.read()# 用一个列表接收提取出来的数据 这里修改了正则表达式,使得每个数值单独作为一列
list = re.findall(r'(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}).*?mdev = (.*?)/(.*?)/(.*?)/(.*?) ms', str, re.S)# 1.创建文件对象
output_file = open('res/ping/ping_flkf_gz.csv', 'w', encoding='utf-8', newline='')
# 2.基于文件对象构建csv写入对象
csv_writer = csv.writer(output_file)
# 3. 写入表头
csv_writer.writerow(["time", "min", "avg", "max", "mdev"])
# 4.遍历列表,写入csv文件
for i in list:csv_writer.writerow([i[0], i[1], i[2], i[3], i[4]])input_file.close()  # 关闭文件
output_file.close()  # 关闭文件

输出到csv文件的效果:

至此就完成了~

案例逐步演示python利用正则表达式提取指定内容并输出到csv相关推荐

  1. Python利用正则表达式提取var自定义变量的值

    目标解析HTML文件中的var自定义变量的值 本文主要利用正则表达式提取页面中的var $render_datab 变量的值,$render_datab变量的值是一个json字符串. 目录 1.导入依 ...

  2. python正则匹配特殊字符_python 利用正则表达式提取特殊信息

    1.删除字符串中的 Python注释 案例: import re time = "2020-01-01 # 这是一个日期" num = re.sub(r'#.*$', " ...

  3. python从文件中提取特定文本_python利用正则表达式提取文本中特定内容

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python ...

  4. 利用正则表达式提取网页中Table内的数据

    利用正则表达式提取网页中Table内的数据 using System; using System.Collections.Generic; using System.Linq; using Syste ...

  5. python实现批量提取指定文件夹下同类型文件

    python实现批量提取指定文件夹下同类型文件 讲解 略 代码 import os import shutildef take_samefile(or_path, tar_path, tar_type ...

  6. 01. 利用正则表达式提取文章中的所有英文单词

    利用正则表达式提取文章中的所有英文单词 1.先创建一个Pattern对象, 模式对象,可以理解成一个正则表达式对象 Pattern pattern = Pattern.compile("[a ...

  7. python正则表达式处理txt,python 正则表达式参数替换实例详解 python使用正则表达式替换txt内容...

    Python正则表达式如何进行字符串替换实例 import res = 'adds23dd56'ss = re.sub(r'\d', '*', s)>>> ss'adds**dd** ...

  8. java 取文本中间_Java 如何利用正则表达式提取两个指定标记符号之间的字符串内容...

    Java 开发中,我们往往需要从非结构化的文本数据中截取两个特定字符之间的内容,可以利用正则表达式获取其间信息. 解决方法 将正则表达式用 Pattern 类的静态方法 compile 一个对象,该对 ...

  9. python 利用正则表达式删除在将一个数据库的表复制到另一个数据库出现insert失败删除原数据库数据

    问题描述 博主在做课设的时候需要将一个数据库的表转移到另一个远程数据库中,但是由于两个数据库的mysql版本不同,出现了Incorrect string value: '\xF0\x9F\xA7\xA ...

最新文章

  1. 情境学习理论视野中的成人学习
  2. AWS — AWS ECS
  3. 如何缩短IDEA行号的距离
  4. show open tables命令 mysql查看哪些表加锁了
  5. Modbus协议栈开发笔记之四:Modbus TCP Client开发
  6. FastDFS文件服务器安装
  7. STM32----摸石头过河系列(八)
  8. paip.c++读写ini文件.
  9. linux汉诺塔实验报告,汉诺塔问题实验报告
  10. 笔记MySQLJavaweb
  11. 嵌入式linux运行mbedtls,mbedTLS(PolarSSL)简单思路和函数笔记(Client端)
  12. 全球新能源500强四季沐歌借助氚云搭建业务系统,实现人效翻倍!
  13. 基于Java怎么实现扫码登录
  14. 侯捷C++八部曲笔记(二、STL标准库和泛型编程)
  15. 使用JS-SDK自定义微信分享效果
  16. 电子音乐包括电声乐器和计算机音乐,对国内电子和电声音乐发展的思考与分析...
  17. 【Matplotlib】(一)绘制图像函数
  18. BLE Peripheral设备的名字显示错误
  19. redis实战教程_Redis详解新手教程_Redis入门到精通
  20. MT6753芯片资料MT6753刷机工具下载

热门文章

  1. 静态代理和动态的本质区别
  2. 数据库-null值和notnull操作
  3. 由控制台输入年龄-不同类型不能直接比较
  4. 排序及其分类(一级)
  5. 3 ie兼容 vue_前端开发:MVVM框架之Vue势必会取代JQuery吗?
  6. multiprocessing.manager管理的对象需要加锁吗_iOS内存管理布局-理论篇
  7. adc采样时间_太秀了!单片机内置 ADC 实现高分辨率采样?
  8. php 微信机器人_微信小程序机器人自动客服功能
  9. zsh和bash的切换,默认shell,alias拼接组合多条命令
  10. 浅谈稳压二极管的选用和使用条件--摘自:工程师飞燕