【问题标题】:Python: Search text file and write block of lines including previous line to another filePython:搜索文本文件并将包括前一行在内的行块写入另一个文件
【发布时间】:2023-03-13 20:11:02
【问题描述】:

我正在搜索一个文本文件,并且想要复制并写入与另一个文本文件中的匹配项相关联的行块。找到搜索条件后,我想将前一行和后 9 行(共 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

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

我已经开始的代码:

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))

上面的代码保存到这样的文件中,第一行和第二行之间有空格:

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

我想保存所有 10 行,就像它们在输入文件中一样。

【问题讨论】:

    标签: python python-3.x python-textprocessing


    【解决方案1】:

    首先,读取文件并找到匹配的行号。跟踪行号以备后用。

    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)
    

    然后,遍历match_lines列表,输出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)    
    

    为了测试这一点,我将创建一个io.StringIO 对象来读取/写入一个字符串作为文件,并要求前一行和后两行:

    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())
    

    给出这个输出:

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

    【讨论】:

    • 谢谢@pranav hosangadi。我有一个更新的要求。我仍然想将整个文本块写入文本文件,但也想将每一行解析为 .csv 文件以在 excel 中打开。你会推荐什么?
    • @DChase 我不确定你的意思。每行是否已经包含在 CSV 中有意义的数据?我建议使用csv.writerwriterow() 方法,但我确实需要更多信息才能做出有意义的推荐。如果您在使用 csv.writer 时遇到问题并且无法弄清楚,请随时发布另一个包含详细信息的问题。如果您在此处分享链接,我将很高兴回答。
    • 我会试一试,如果我还有问题,请告诉您。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多