Replace a specific word given its position in a text file (Python)

前端 未结 2 952
情歌与酒
情歌与酒 2021-01-25 15:43

I have a list of tuples, each on contains a word-to-be-replaced, its line and column number positions from a given text file. I want to go through the text file and repl

2条回答
  •  无人共我
    2021-01-25 16:16

    Consider a single line:

    word1 a word2 a word3 a word4

    If you have these changes:

    [('word1', 1, 1), ('word2', 1, 9), ... ]
    

    And you process them in order:

    * a word2 a word3 a word4

    You will fail, because you are changing the positions of the words when you replace 'word1' with '*', a shorter string.

    Instead, you will have to sort the list of changes by line, reversed by column:

    changes = sorted(changes, key=lambda t: (t[1], -t[2]))
    

    You can then process the changes as you iterate through the file, shown in the link referenced by @JRajan:

    with open("file", "r") as fp:
        fpline_text = enumerate(fp)
        fpline,text = next(fpline_text)
    
        for edit in changes:
            word,line,offset = edit
            line -=1  # 0 based
    
            while fpline < line:
                print(text)
                fpline,text = next(fpline_text)
    
            offset -= 1    # 0-based
            cand = text[offset:offset+len(word)]
    
            if cand != word:
                print("OOPS! Word '{}' not found at ({}, {})".format(*edit))
            else:
                text = text[0:offset]+'*'+text[offset+len(word):]
    
        # Rest of file
        try:
            while True:
                print(text)
                fpline,text = next(fpline_text)
        except StopIteration:
            pass
    

提交回复
热议问题