Python在找到特定字符串时从文件中提取数据
我试图从PUT_LOG标记中提取(LOG_LEVEL_DEBUG,Capture_RECVD_SIGCHLD),只要找到PUT_LOG标记,我只想提取其中的信息并将其放入另一个文件中 请查找要从中提取信息的代码段Python在找到特定字符串时从文件中提取数据,python,Python,我试图从PUT_LOG标记中提取(LOG_LEVEL_DEBUG,Capture_RECVD_SIGCHLD),只要找到PUT_LOG标记,我只想提取其中的信息并将其放入另一个文件中 请查找要从中提取信息的代码段 PUT_LOG(LOG_LEVEL_DEBUG, CAPTIVE_EXECUTE_CMD,1,STRING, cmd); PUT_LOG(LOG_LEVEL_DEBUG, CAPTIVE_EXECUTE_CMD,1,STRING, cmd); PUT_LOG(LOG_LEVEL_DEB
PUT_LOG(LOG_LEVEL_DEBUG, CAPTIVE_EXECUTE_CMD,1,STRING, cmd);
PUT_LOG(LOG_LEVEL_DEBUG, CAPTIVE_EXECUTE_CMD,1,STRING, cmd);
PUT_LOG(LOG_LEVEL_DEBUG_ERR, CAPTIVE_EXECUTE_CMD_FAILED,1, STRING, cmd);
enter code here
my out put should be like this
LOG_LEVEL_DEBUG
CAPTIVE_EXECUTE_CMD
LOG_LEVEL_DEBUG_ERR
CAPTIVE_EXECUTE_CMD_FAILED
我已经写了这样的代码..你能修改一下并给我额外的代码吗
#!/usr/bin/env python
inFile = open("data.c")
outFile = open("result.txt", "w")
buffer = []
keepCurrentSet = True
for line in inFile:
buffer.append(line)
if line.startswith("PUT_LOG"):
#---- starts a new data set
if keepCurrentSet:
outFile.write("".join(buffer))
#now reset our state
keepCurrentSet = False
buffer = []
elif line.startswith("LOG_LEVEL_DEBUG"):
keepCurrentSet = True
inFile.close()
outFile.close()
使用输入文件
file\u in
、输出文件file\u out
和列表strings\u to\u filter
,从作为参数给定的源文件中提取字符串,提取行(file\u in,file\u out,strings\u to\u filter)
将找到file\u in
中的任何一行,无论PUT\u LOG(…)的括号是什么代码>包含在中间,对照已接受字符串的列表strings\u to\u filter
对其进行交叉检查,并将其(添加到新行)添加到out.txt
:
import os
import re
def extract_lines(file_in, file_out, strings_to_filter):
with open(file_in) as f_in, open(file_out, "a+") as f_out:
for line in f_in:
res = re.search("(PUT_LOG\()(.*)(\)\;)", line)
if res is not None:
i = 0
for segment in res.group(2).split(","):
segment = segment.strip()
if segment in strings_to_filter and i < 2:
print(segment, file=f_out)
i += 1
extract_lines(
os.path.realpath("path/to/log_file.txt"),
os.path.realpath("path/to/output_file.txt"),
[
"CAPTIVE_EXECUTE_CMD",
"CAPTIVE_EXECUTE_CMD_FAILED",
"CAPTIVE_RECVD_SIGCHLD",
"LOG_LEVEL_DEBUG",
"LOG_LEVEL_DEBUG_ERR"
]
)
导入操作系统
进口稀土
def提取行(文件输入、文件输出、字符串到过滤器):
将open(file_in)作为f_in,将open(file_out,“a+”)作为f_out:
对于f_in中的行:
res=re.search(((放置日志\()(.*)(\)\;)”,第行)
如果res不是None:
i=0
对于res.group(2)中的段。拆分(“,”):
段=段.strip()
如果字符串中的段\u到\u过滤器且i<2:
打印(段,文件=f_out)
i+=1
提取线(
realpath(“path/to/log_file.txt”),
realpath(“path/to/output_file.txt”),
[
“俘虏执行命令”,
“强制执行命令失败”,
“俘虏”\u RECVD\u SIGCHLD,
“日志级调试”,
“日志\u级别\u调试\u错误”
]
)
很高兴看到您尝试了什么。这都是“你给我看你的,我给你看我的”中的SO:)你明白了吗..我的预期结果是什么操作系统那么我怎样才能开始给我f_in中的行的complte code。readlines()
将比f_in中的行的更简单,内存效率更高。类似地,open(file\u in,“r”)
比open(file\u in)
更简单。您还可以轻松避免使用全局变量,并将它们传递给extract_line()
,这将明确显示其结果取决于两个参数。最后,你不应该写(…+'\r')
:换行符不正确:你应该做打印>>f\u out,segment
。为了一个干净的解决方案,我将把你的建议添加到我的帖子中。@bossi:Python3版本的print>>f_out,segment
是print(segment,file=f_out)
@bossi:yourwith open(file_out,“a+”)。as f_out:
可以放在与您的同一行,open(file_in)as f_in:
,使文件只打开一次(无需反复打开):打开(文件输入)为f\u输入,打开(文件输出,'a+')为f\u输出:
。