Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在找到特定字符串时从文件中提取数据_Python - Fatal编程技术网

Python在找到特定字符串时从文件中提取数据

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,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_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:your
with open(file_out,“a+”)。as f_out:
可以放在与您的
同一行,open(file_in)as f_in:
,使文件只打开一次(无需反复打开):
打开(文件输入)为f\u输入,打开(文件输出,'a+')为f\u输出: