Способ найти слово в текстовом документе и удалить строку со словом и следующие 6 строк (Python)

#python

Вопрос:

Есть ли способ открыть текстовый файл, найти слово, удалить строку со словом и следующие 6 строк из него?

Ответ №1:

Здесь я объясню логику file редактирования с помощью различных разделов:

Сначала мы открываем файл в read write mode , потому что r doesn't overwrite the previously written file

 f = open("file.txt", 'r')
content = f.read()
 

Затем мы split разделяем его на различные линии

 lines_ = content.split('n')[::-1]
word = input('Enter your words : ')
 

Примените логику, чтобы удалить строку слова maatch и 6 последовательных строк.

 for i, j in zip(range(len(lines_)), lines_):
    if word in j:
        for k in range(7):
            if i > abs(k):
                del lines_[i-k]
file_ = 'n'.join(lines_[::-1])
f.close()
 

Снова мы открываем файл, чтобы записать эту обновленную строку обратно в файл, поэтому мы используем w write mode , который сначала очищает файл, а затем помещает в него строку

 with open("file.txt", 'w') as f:
    f.write(file_)
 

Комментарии:

1. Добро пожаловать! Я рад, что помогаю вам. Пожалуйста, следуйте Stack Overflow инструкциям во время допроса.

2. Я бы предложил использовать ‘r’ для открытия файла — нам нужно только читать, запись не используется. Также вы предложили with open() в конце, что это «питонский способ», но вы не сделали этого при открытии файла для чтения и в начале. @ExplooreX

3. спасибо за этот момент, который я добавлю. Но для ясного объяснения я разделяю это на разделы, поэтому без какого-либо рассмотрения fileNotFound Error или пространства имен.

4. Также, когда речь идет об удалении, я бы предложил читать строки от конца до начала, чтобы мы не пропускали совпадения при удалении предыдущего совпадения. Представьте, что у нас есть 10 строк, а волшебное слово находится в строках 1 и 5 — если мы начнем удалять с самого начала, мы удалим второе волшебное слово и оставим больше строк

5. Спасибо за ваш ответ, он не работал раньше, но получил его сейчас. Спасибо!!!!!!!

Ответ №2:

Это должно сработать

 def look_and_delete(file,word_to_look_for):
  files = open(file,'r')
  contents = files.readlines()
  print(contents)
  line  = 0
  file_words = ''
  for i in contents:
    print(i)
    if word_to_look_for in i:
      print("im in here on line", line)
    else:
      file_words =i
    line =1
  print(file_words)
  files.close()
  files = open(file,'w')
  files.write(file_words)
  files.close()
 

Не стесняйтесь удалять заявление о печати, они не имеют значения

Комментарии:

1. Да, это работает, если вы хотите заменить или удалить 1 строку из документа, но я хотел удалить строку со словом 5 строк. Спасибо за ваш ответ, тхо!

Ответ №3:

Я бы подошел к этому по — другому
: Сначала откройте файл и прочитайте строки для последующего, n=5 значит-удалите 5 строк, включая строку с волшебным словом.

 magic_word = 'foo'
n = 5
with open('file.txt', 'r') as file_handle:
    lines = file_handle.readlines()
num_lines = len(lines)
 

Далее мы перечисляем по строкам, но в обратном порядке. Это очень важно для углового случая, например:
Если мы примем такой вклад:

 test1
foo
test2
test3
test4
foo
test5
test6
test7
test8
 

Чтение файла от начала до конца (пусть n=5 ) и поиск волшебного слова приведет к выходу:

 test1
test5
test6
test7
test8
 

Но если мы посмотрим и удалим с другого конца, то результат будет:

 test1
 

Вот почему мы должны чтить орден.

strip это просто для того, чтобы мы могли удалить n перед сравнением.

 for idx, word in enumerate(reversed(lines)):
    # now going from the end of a file
    word = word.strip()
 

Когда мы находим волшебное слово, мы должны удалить n строку из этой точки до конца файла. Самая простая операция для удаления частей итерируемого в python-это нарезка

например, obj[1:5] вырезать объекты в диапазоне <1,5> или obj[:5] вырезать объекты в диапазоне <0,5>

     if word == magic_word:
        left_bound = num_lines-idx-1
        if left_bound   n >= num_lines:
            lines = lines[:left_bound]
        else:
            lines = lines[:left_bound]   lines[left_bound n:]
 

Все, что осталось, это сохранить файл(переопределить)

 with open('file.txt', 'w') as file_handle:
    lines = file_handle.writelines(lines)
 

Комментарии:

1. Ты сломал мне мозг этим решением, я не понимаю его так, как мне нужно, и это также не сработает для меня. Все равно огромное спасибо вам, потому что вы подали мне несколько идей, чтобы попробовать и узнать больше!

2. @Jenby32 если вы сочтете это полезным, я был бы признателен за отзыв 🙂

3. О да, это был не тот ответ, который мне нужен, но он мне помог. Спасибо! 😀