Это ответвление на вопрос, который я задал здесь.
Я пытаюсь настроить метод, который может редактировать текстовые файлы на основе входного словаря. Это то, что у меня есть до сих пор:
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, в данном случае новые строки. Однако я понимаю, что цикл for должен идти построчно и просто идти по этой строке. Может ли кто-нибудь сказать мне, что мне здесь не хватает?
info
нет ключей'#keep this'
или'#delete this'
, поэтому он всегда будет иметь значение False и перейти к оператору else, и в этом случае он должен просто распечатать весь файл. - person Grand Phuba   schedule 07.04.2020