Замените определенное слово, учитывая его положение в текстовом файле (Python)

У меня есть список кортежей, каждый из которых содержит заменяемое слово, его позиции строки и столбца из заданного текстового файла. Я хочу пройти через текстовый файл и заменить это конкретное слово этой конкретной позиции символом (например, [('word1', 1, 1), ('word2', 1, 9), ... ] ).

Другими словами, учитывая определенное слово, его номера строк и столбцов внутри текстового файла я пытаюсь найти и заменить это слово символом, например:

учитывая, что текстовый файл содержит следующее ( предполагая, что его позиция отображается так, как она отображается – здесь не написана )

Возбудило его теперь естественные пилы, которые вы занимаете. По стопам суды надеются. Дальше, чтобы друзья отвлекались. Forbade беспокойство делают частным. Оскорбление резиденции, но мужчины застенчивы. Притворяйтесь, что у вас действительно тяжелая прибывшая компания. Сообщалось, что Фелисити пришлось строго признавать, как укладывать вас.

и учитывая, что слово для замены – это stack с позицией в тексте, который будет строкой 3 и столбцом 16 , чтобы заменить его символом * ,

поэтому после замены произойдет, что текстовый файл будет иметь следующее содержимое:

Возбудило его теперь естественные пилы, которые вы занимаете. По стопам суды надеются. Дальше, чтобы друзья отвлекались. Forbade беспокойство делают частным. Оскорбление резиденции, но мужчины застенчивы. Притворяйтесь, что я пришла в компанию. Сообщалось, что Фелисити пришлось строго признавать, как укладывать вас.

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

Кто-нибудь знает способ сделать это в Python?

РЕДАКТИРОВАТЬ

Первоначальное решение, предлагаемое с использованием genfromtxt numpy (скорее всего) не подходит после обсуждения в последующей проблеме, поскольку существует необходимость в том, чтобы каждая строка текстового файла присутствовала и не пропускалась (например, пустые строки, строки, начинающиеся с ' w 'и строки внутри' / * .. / ').

2 Solutions collect form web for “Замените определенное слово, учитывая его положение в текстовом файле (Python)”

Попробуйте рецепт:

 import numpy as np import os def changethis(pos): # Notice file is in global scope appex = file[pos[1]-1][:pos[2]] + '*' + file[pos[1]-1][pos[2]+len(pos[0]):] file[pos[1]-1] = appex pos = ('stack', 3, 16) file = np.array([i for i in open('in.txt','r')]) #BEFORE EDIT: np.genfromtxt('in.txt',dtype='str',delimiter=os.linesep) changethis(pos) print(file) 

В результате получается следующее:

 [ 'Excited him now natural saw passage offices you minuter. At by stack being court hopes. Farther' 'so friends am to detract. Forbade concern do private be. Offending residence but men engrossed' 'shy. Pretend am * earnest arrived company so on. Felicity informed yet had to is admitted' 'strictly how stack you.'] 

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

EDIT: Поскольку @ user2357112 заставлял меня понять, что выбор для чтения файлов был не самым подходящим (хотя он работал для рассматриваемого упражнения), поэтому я отредактировал этот ответ, чтобы предоставить такое же решение, данное в следующем вопросе .

Рассмотрим одну строку:

слово1 слово2 слово3 слово4

Если у вас есть эти изменения:

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

И вы обрабатываете их по порядку:

* слово2 слово3 слово4

Вы потерпите неудачу, потому что вы меняете позиции слов, когда вы заменяете «word1» на «*», более короткую строку.

Вместо этого вам придется отсортировать список изменений по строке, отменив столбец:

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

Затем вы можете обрабатывать изменения по мере повторения файла, как показано в ссылке, на которую ссылается @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 
  • Включение отформатированного итерации как части большей форматированной строки
  • Существует ли потолочный эквивалент оператора // в Python?
  • поддерживает nolearn / lasagne python 3
  • Python 3.3 CSV.Writer пишет дополнительные пустые строки
  • От stat (). St_mtime до datetime?
  • Как написать двоичные данные в stdout в python 3?
  • Pexpect и PyCharm - Несоответствующий ioctl для устройства
  • Как изменить строковое представление класса Python?
  • Установите часть лямбда-функции заранее, чтобы избежать повторного кода
  • Python 3.2 - cookielib
  • Измените значение каждого N-го элемента в списке
  • Python - лучший язык программирования в мире.