首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >逐行读取文本文件,并在Python中存储匹配特定模式的变量

逐行读取文本文件,并在Python中存储匹配特定模式的变量
EN

Stack Overflow用户
提问于 2018-08-30 03:33:23
回答 3查看 1.8K关注 0票数 1

我们有一个很大的日志文件,其中包含以下两行:

代码语言:javascript
复制
00 LOG     |   Cycles Run:  120001
00 LOG     ! Virtual: Max> ?????????? bytes (?.???? gb), Current> 640733184 bytes (?.???? gb).

00 LOG     ! Virtual: Max> 1082470400 bytes (?.???? gb), Current> ????????? bytes (?.???? gb).

00 LOG     ! Actual: Max> ????????? bytes (?.???? gb), Current> 472154112 bytes (?.???? gb).

00 LOG     ! Actual: Max> 861736960 bytes (?.???? gb), Current> ????????? bytes (?.???? gb).

由于日志文件很大,我们希望逐行读取(而不是一次读取缓冲区中的整个文本),匹配特定的模式集,并在单独的变量中拾取值。

例如:

代码语言:javascript
复制
00 LOG     |   Cycles Run:  120001

我们希望选择120001并将其存储在一个变量中,比如cycle

另一方面,我们解析这些行:

代码语言:javascript
复制
00 LOG     ! Virtual: Max> ?????????? bytes (?.???? gb), Current> 640733184 bytes (?.???? gb).

00 LOG     ! Virtual: Max> 1082470400 bytes (?.???? gb), Current> ????????? bytes (?.???? gb).

00 LOG     ! Actual: Max> ????????? bytes (?.???? gb), Current> 472154112 bytes (?.???? gb).

00 LOG     ! Actual: Max> 861736960 bytes (?.???? gb), Current> ????????? bytes (?.???? gb).

?标记的字符可以是任何数字。

我们想要存储像这样的变量:

var virtual_cur中的

640733184

var virtual_max中的1082470400

var actual_cur中的472154112

var actual_max中的861736960

Python 3.6编写了一个代码片段,但它打印的是空列表:

代码语言:javascript
复制
import re

filename = "test.txt"
with open(filename) as fp:  
   line = fp.readline()
   while line:
       cycle_num = re.findall(r'00 LOG     |   Cycles Run:  (.*?)',line,re.DOTALL)
       line = fp.readline()

print (cycle_num[0])

注意:我想在单独的变量中选择每个值,并在以后使用它。需要逐个设置5个模式,如果匹配任何特定模式,则选择值并将其放入相应的变量中。

不确定第二个模式的通配符是否匹配。

请给我们一个有效的方法来做这件事。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-30 04:13:47

使用正则表达式

代码语言:javascript
复制
(?:(?:Cycles Run:[ \t]+)|(?:Current>[ \t]+))(\d+)

Demo

你可以按照下面的思路做一些事情:

代码语言:javascript
复制
import re
pat=re.compile(r'(?:(?:Cycles Run:[ \t]+)|(?:Current>[ \t]+))(\d+)')
with open('test.txt','r') as f:   
    for line_num, line in enumerate(f):
        m=pat.search(line)
        if m:
            print(line_num, m.group(0))
票数 2
EN

Stack Overflow用户

发布于 2018-08-30 03:57:21

你可以在这里使用一个带有两个lookbehinds的替换:

代码语言:javascript
复制
(?<=Cycles Run:  )\d+|(?<= Current>  )\d+

正则表达式演示here

Python示例:

代码语言:javascript
复制
import re
text = '''
00 LOG     |   Cycles Run:  120001
00 LOG     !   Virtual: Max> 1082470400 bytes (1.0081 gb), Current>  640733184 bytes (0.5967 gb)
'''

pattern = re.compile(r'(?<=Cycles Run:  )\d+|(?<= Current>  )\d+')
matches = re.findall(pattern,text)
num_cycle = matches[0]
current = matches[1]

print(num_cycle,current)

打印:

代码语言:javascript
复制
120001 640733184

由于您在循环中重复该过程,因此建议在循环之前只使用re.compile编译一次模式。

票数 1
EN

Stack Overflow用户

发布于 2018-08-30 04:01:48

这里我们搜索一些标识符(比如cycles并应用不同的正则表达式)

代码语言:javascript
复制
import re
with open('test.txt','r') as f:
    for line in f:
        if re.search(r'Cycles',line):
            m=re.findall(r'\d+$',line)
        else:
            m=re.findall(r'Current>  (\d+)',line)
        print(m)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52084871

复制
相关文章

相似问题

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