Замените определенное слово, учитывая его положение в текстовом файле (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 только одним из его значений
  • Команда «collectstatic» не работает, когда WhiteNoise включен
  • Каковы альтернативы «python3 sample_program.py &» через ssh?
  • Округление Python3 до ближайшего четного
  • Ленько транспонировать список в Python
  • Ошибка синтаксиса в библиотеке jinja 2
  • Что может помешать трассировке от сбора мусора?
  •  
    Interesting Posts for Van-Lav

    Приложение Mac на El Capitan с дочерним процессом Python

    Пип внезапно использует неправильную версию Python

    sklearn GaussianNB – плохие результаты, вероятности

    Вставка pyodbc в sql

    UnBoundLocalError: Локальная переменная, на которую ссылаются перед назначением

    Могу ли я изменить поведение BeautifulSoup на преобразование тегов XML в нижний регистр?

    Как создать динамические переменные в Python?

    Операторы сравнения Python цепочки / группировки слева направо?

    Найти определенные переменные внутри функции и вернуть их отсортированные

    Настройка админ-страницы feincms на основе пользователя

    ImportError: Нет модуля с именем IPython.path при запуске jupyter notebook?

    Можно ли проверить, уже ли задана переменная контекста в представлении в определении пользовательского контекстного процессора?

    Предоставление Django загружаемых файлов

    Как найти информацию о функции в python?

    Печать столбца 2-D-списка в Python

    Python - лучший язык программирования в мире.