在python中解析文本文件

时间:2016-10-03 18:55:37

标签: text-processing python

所以我正在尝试python程序,它将从存储在文本文件中的Web服务器ping中提取往返时间。所以我基本上有一个文本文件:

    PING e11699.b.akamaiedge.net (104.100.153.112) 56(84) bytes of data.
    64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=1 ttl=60 time=17.2ms
    64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=2 ttl=60 time=12.6ms
    64 bytes from a104-100-153-112.deploy.static.akamaitechnologies.com (104.100.153.112): icmp_seq=3 ttl=60 time=11.7ms
    ... (a bunch more ping responses here)
    --- e11699.b.akamaiedge.net ping statistics ---
    86400 packets transmitted, 86377 received, 0% packet loss, time 86532481ms
    rtt min/avg/max/mdev = 6.281/18.045/1854.971/28.152 ms, pipe 2

我是python的新手,需要帮助才能使用正则表达式命令仅提取" time ="之间的时间。和" ms"并将其发送到另一个文本文件,如下所示:

11.7
12.6
17.2
...

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:5)

由于这似乎来自命令,您可以像这样使用

grep -oP 'ttl=\d+\s+time=\K[\d\.]+' file    

输出:

17.2
12.6
11.7

注意:

搜索SO或/和谷歌在纯python 中使用此正则表达式非常简单。

提示:

Support of \K in regex

加成

因为我还是要玩python:

(在 shell中):

python2 <<< $'import re\nf = open("/tmp/file", "r")\nfor textline in f.readlines():\n\tmatches = re.finditer("ttl=\d+\s+time=([\d\.]+)ms", textline)\n\tresults = [float(match.group(1).strip()) for match in matches if len(match.group(1).strip())]\n\tif results:\n\t\tprint results[0]\nf.close()\n'

答案 1 :(得分:1)

因为你要求使用Python,所以它是:

$ ping -c 4 8.8.8.8 | python -c 'import sys;[ sys.stdout.write(l.split("=")[-1]+"\n") for l in sys.stdin if "time=" in l]'            
10.5 ms

9.22 ms

9.37 ms

9.71 ms

注意,这有stdout缓冲,因此您可能想要添加sys.stdout.flush()。随意将其从一个班轮转换为剧本

答案 2 :(得分:0)

您指定数据已存在于文本文件中。因此,假设您的文本文件名为data.txt

#we will be using the regular expression library for this example
import re 

#open the "data.txt" (named data_file in a scope)
with open("data.txt") as data_file: 
    #read the text from the data_file into ping_data
    ping_data = data_file.read() 
    found_data = re.findall('time=(.*)ms', ping_data)

with open('found.txt', 'w') as found_file:
    for pattern in found_data:
        found_file.write(pattern+"\n")

此填充输出名为found.txt的文件,其中包含以下内容:

17.2
12.6
11.7

在示例中,我们只打开您的data.txt文件。然后从中读取数据。然后查找将返回您要查找的数据的正则表达式模式的所有匹配项。

time=(.*)ms表示*字母time=ms之间的任意大小的字符串

然后在我们找到patern后,我们只需将其写入另一个名为found.txt的文件中,一次写一行直到完成。