简体   繁体   English

Python:搜索文本文件并将包括前一行在内的行块写入另一个文件

[英]Python: Search text file and write block of lines including previous line to another file

I am searching through a text file and want to copy and write a block of lines associated with a match in another text file.我正在搜索一个文本文件,并希望复制并写入与另一个文本文件中的匹配项关联的行块。 Once i find the search criteria, i want to copy/write out the previous line and next 9 lines (total of 10 lines) out to a file for each match.一旦我找到搜索条件,我想将前一行和下 9 行(总共 10 行)复制/写出到每个匹配的文件中。

Example input file to be search要搜索的示例输入文件

Line 1: File sent to xyz blah blah:
                             Line 2: Search Criteria here
                             Line 3
                             Line 4
                             Line 5
                             Line 6
                             Line 7
                             Line 8
                             Line 9
                             Line 10

Line 1: File sent to xyz blah blah:
                             Line 2: Search Criteria here
                             Line 3
                             Line 4
                             Line 5
                             Line 6
                             Line 7
                             Line 8
                             Line 9
                             Line 10

Code i have started:我已经开始的代码:

searchList = []
searchStr = "Search Criteria here"

with open('', 'rt') as fInput:
    previous = next(fInput)
    for line in fInput:
        if line.find(searchStr) != -1:
            searchList.append(previous)
            searchList.append(line.lstrip('\n'))


with open('Output.txt','a') as fOutput:
    OutPut.write("\n".join(searchList))

The code above saves to a file like this with spaces in between the first and second line:上面的代码保存到这样的文件中,第一行和第二行之间有空格:

mm/dd/yyy  hh:mm:ss.MMM File sent to xyz:

                             Line 2: Search Criteria here

mm/dd/yyy  hh:mm:ss.MMM File sent to xyz:

                             Line 2: Search Criteria here

I want save all 10 lines, exactly as they are in the input file.我想保存所有 10 行,就像它们在输入文件中一样。

First, read the file and find the line numbers that match.首先,读取文件并找到匹配的行号。 Keep track of the line numbers for later.跟踪行号以备后用。

all_lines = []
match_lines = []

with open('in_file.txt', 'r') as fInput:
    for number, line in enumerate(fInput):
        all_lines.append(line)
        if searchStr in line:
            match_lines.append(number)

Then, loop over the match_lines list and output the lines you care about from all_lines :然后,遍历match_lines列表和 output 来自all_lines的您关心的行:

num_lines_before = 1
num_lines_after = 10
with open('out_file.txt', 'w') as fOutput:
    for line_number in match_lines:
        # Get a slice containing the lines to write out
        output_lines = all_lines[line_number-num_lines_before:line_number+num_lines_after+1]
        fOutput.writelines(output_lines)    

To test this, I'm going to create a io.StringIO object to read/write a string as a file, and ask for one line before and two after:为了测试这一点,我将创建一个io.StringIO object 来读取/写入一个字符串作为文件,并在之前和之后要求一行:

import io

strIn = """This is some text
12345
2 searchforthis
34567
45678
5 searchforthis
63r23tf
7pr9e2380
89spver894
949erc8m9
100948rm42"""

all_lines = []
match_lines = []
searchStr = "searchforthis"

# with open('in_file.txt', 'r') as fInput:
with io.StringIO(strIn) as fInput:
    for number, line in enumerate(fInput):
        all_lines.append(line)
        if searchStr in line:
            match_lines.append(number)

num_lines_before = 1
num_lines_after = 2



# with open('out_file.txt', 'w') as fOutput:
with io.StringIO("") as fOutput:
    for line_number in match_lines:
        # Get a slice containing the lines to write out
        output_lines = all_lines[line_number-num_lines_before:line_number+num_lines_after+1]
        fOutput.writelines(output_lines)    
        fOutput.write("----------\n") # Just to distinguish matches when we test
    
    fOutput.seek(0)
    print(fOutput.read())

Gives this output:给出这个 output:

12345
2 searchforthis
34567
45678
----------
45678
5 searchforthis
63r23tf
7pr9e2380
----------

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM