Это ответвление на вопрос, который я задал здесь .
Я пытаюсь настроить метод, который может редактировать текстовые файлы на основе входного словаря. Вот что у меня есть:
info = {'#check here 1':{'action':'read'}, '#check here 2':{'action':'delete'}}
search_pattern = re.compile(r'.*(#.+)')
with open(input_file_name, "r") as old_file, open(output_file_name, "w+") as new_file:
lines = old_file.readlines()
for line in lines:
edit_point = search_pattern.search(line)
if edit_point:
result = edit_point.group(1)
if result in info and info[result]["action"] == "insert":#insert new lines to file
print("insert information to file")
new_file.write("\n".join([str(n) for n in info[result]["new_lines"]]))
new_file.write(result)
elif result in info and info[result]["action"] == "delete":#skip lines with delete action
print("found deletion point. skipping line")
else:#write to file any line with a comment that is not in info
new_file.write(line)
else:#write lines that do not match regex for (#.*)
new_file.write(line)
По сути, когда вы отправляете словарь, программа перебирает файл в поисках комментариев. Если комментарий есть в словаре, он проверит соответствующее действие. Если действие вставить, оно запишет строки в файл. Если это удалить, он пропустит эту строку. Любая строка, в которой нет комментария, должна быть записана в новый файл.
Моя проблема в том, что когда я удаляю строку из файла, появляется дополнительная строка, где они были раньше. Например, если у меня есть список:
hello world
how are you #keep this
I'm fine #check here 2
whats up
Я ожидаю, что результат будет:
hello world
how are you #keep this
whats up
Но вместо этого у меня есть пустая строка:
hello world
how are you #check here 2
whats up
Я подозреваю, что это мой последний оператор else, который записывает в файл любую строку, которая не соответствует edit_point, в данном случае новые строки. Тем не менее, я понимаю, что для l oop должна go строка за строкой, и просто go этой строки. Кто-нибудь может сказать мне, что мне здесь не хватает?