Этот «ответ» предназначен для лир ... Я исправлю свой предыдущий комментарий: если стрелка находится в первых 3 строках файла, ваш скрипт вызовет ошибку IndexError или получит доступ к строке, которой он не должен быть доступным, иногда с интересными побочными эффектами.
Пример вашего скрипта, вызывающего IndexError:
>>> lines = "@string line 0\nblah blah\n".splitlines(True)
>>> needle = "@string "
>>> for i,line in enumerate(lines):
... if line.startswith(needle) and lines[i-3].startswith(needle):
... lines[i-3] = lines[i-3].replace(needle, "")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IndexError: list index out of range
и этот пример показывает не только то, что Земля круглая, но также и то, почему ваше «исправление» проблемы «не удалять всю линию» должно было использовать .replace(needle, "", 1)
или [len(needle):]
вместо .replace(needle, "")
>>> lines = "NEEDLE x NEEDLE y\nnoddle\nnuddle\n".splitlines(True)
>>> needle = "NEEDLE"
>>> # Expected result: no change to the file
... for i,line in enumerate(lines):
... if line.startswith(needle) and lines[i-3].startswith(needle):
... lines[i-3] = lines[i-3].replace(needle, "")
...
>>> print ''.join(lines)
x y <<<=== whoops!
noddle
nuddle
<<<=== still got unwanted newline in here
>>>