首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python挖掘信息

用Python挖掘信息
EN

Stack Overflow用户
提问于 2019-08-24 04:45:32
回答 1查看 61关注 0票数 2

我想从日志文件中挖掘出信息并编写如下脚本:

代码语言:javascript
复制
import re

file = '''Date,Time,Type,User,Message
Thu Jul 18, 2019 14:18:41.945,EFM,201202      ,Robot picked
Thu Jul 18, 2019 14:18:51.486,DS ,201202      ,Module 1
Thu Jul 18, 2019 14:19:07.747,DS ,201202      ,Door opened
Thu Jul 18, 2019 14:20:08.231,EFM,203204205206,Robot picked
Thu Jul 18, 2019 14:20:08.231,DS ,203204      ,Module 2
Thu Jul 18, 2019 14:20:10.282,DS ,203204      ,Door opened
...
'''

p1 = re.compile(r'\w{3} \w{3} \d\d, \d{4} (\d\d:\d\d:\d\d.\d{3}),EFM,(\d+?\s*?),Robot picked')
p2 = re.compile(r'\w{3} \w{3} \d\d, \d{4} (\d\d:\d\d:\d\d.\d{3}),DS ,(\d+?\s*?),Module 1')
p3 = re.compile(r'\w{3} \w{3} \d\d, \d{4} (\d\d:\d\d:\d\d.\d{3}),DS ,(\d+?\s*?),Door opened')

w_file = r'D:\sample.txt'
lines = file.readlines()
t_file =open(w_file,'w')
info = ['User','Time1','Time2','Time3' ]
t_file.write('{}\n'.format(','.join(item for item in info)))

for line in lines:
    p1_line = re.findall(p1, line.strip())
    p2_line = re.findall(p2, line.strip())
    p3_line = re.findall(p3, line.strip())
    if p1_line and p2_line and p3_line:
        if p1_line[0][1][:3] == p2_line[0][1][:3] and p1_line[0][1][:3] == p5_line[0][1][:3]:
            t_file.write('{},{},{},{}\n'.format(p1_line[0][1].strip(),p1_line[0][0],p2_line[0][0],p3_line[0][0])

t_file.close()

打开sample.txt文件时,只有'User,Time1,Time2,Time3‘行。有谁能在我的剧本里找到出什么问题吗?

我想要的是:

代码语言:javascript
复制
User,Time1,Time2,Time3
201202,14:18:41.945,14:18:51.486,14:19:07.747
203204205206,14:20:08.231,14:20:08.231,14:20:10.282
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-24 06:01:54

脚本的问题是,您试图将所有正则表达式匹配到同一行,然后执行一个and条件,这当然会失败。

每个正则表达式都可以工作,但只适用于特定的行,因此,3行中有2行将返回[],其计算结果为False

例如,考虑到:

代码语言:javascript
复制
 line = 'Thu Jul 18, 2019 14:18:41.945,EFM,201202      ,Robot picked'

你将拥有:

代码语言:javascript
复制
p1_line = [('14:18:41.945', '201202      ')]  # match
p2_line = []                                  # no match
p3_line = []                                  # no match

一旦您对这三个值进行了and,条件将计算为False,因此不会将任何内容写入文件:

代码语言:javascript
复制
if p1_line and p2_line and p3_line:  # this evaluates to False

因此,根据您想要实现的确切逻辑,您可能需要存储和记住过去的匹配,并在此基础上进行构建。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57635174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档