Вставить заменяющий текст на основе имени в другом файле с помощью скрипта на Python

Вопрос или проблема

У меня есть два текстовых файла. Файл 1 — это список имен сеток с путями. Иногда имя совпадает с именем пути и может содержать цифры.

Мне нужно вставить имя/путь из Файла 1 в каждую строку StaticMesh=StaticMesh'Dog', соответствующую его ‘name’

Файл 2 — это блоки данных, в которых мне нужно изменить определенные строки. Эти строки всегда содержат StaticMesh=StaticMesh'REPLACEWORD'

У меня есть скрипт на Python, но возникает ошибка.

Traceback (most recent call last):
  File "C:\Users\TUFGAMING\Desktop\python\main.py", line 32, in <module>
    main()
  File "C:\Users\TUFGAMING\Desktop\python\main.py", line 14, in main
    word_tuples.append((words[0], words[1]))
IndexError: list index out of range

(Файл 1)

Dog /Game/Meshes/Bulldog

Fish /Game/Meshes/Goldfish

Cat /Game/Meshes/Cat

(Файл 2)

StaticMesh=StaticMesh'Dog'

StaticMesh=StaticMesh'Fish'

StaticMesh=StaticMesh'Cat'

(Результат)

StaticMesh=StaticMesh'/Game/Meshes/Bulldog'

StaticMesh=StaticMesh'/Game/Meshes/Goldfish'

StaticMesh=StaticMesh'/Game/Meshes/Cat'
import re


def main():
    file_one="file-1.txt"
    file_two = 'file-2.txt'

    # содержит (первое слово, вторая строка)
    word_tuples = []

    with open(file_one, 'r') as file:
        for line in file:
            words = line.split()  # разбивает по пробелам
            word_tuples.append((words[0], words[1]))

    with open(file_two, 'r') as file:
        for line in file:
            # извлечение содержимого между одинарными кавычками
            match = re.search(r"StaticMesh=?'(.+)'", line)
            quoted_word = match.group(1)

            # проверяем, совпадает ли какая-либо из строк из файла 1
            for word_tuple in word_tuples:
                if word_tuple[0] == quoted_word:
                    print("НАЙДЕНО СОВПАДЕНИЕ")
                    print(f"file1: {word_tuple[0]} {word_tuple[1]}")
                    print(f"file2: {line.strip()}")
                    print(f"file3: {line}".replace(quoted_word, word_tuple[1]))


if __name__ == '__main__':
    main()

Ответ или решение

Добрый день,

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

Теория

Проблема, с которой вы столкнулись, имеет несколько основных компонентов:

  1. Файловая обработка – чтение данных из текстовых файлов, которые содержат ключевые данные для выполнения замен.
  2. Манипуляция строками – необходимо изменять содержимое текста, основываясь на специфичных правилах.
  3. Регулярные выражения – используются для поиска и извлечения нужной информации в строках.

Основные этапы решения это задачи:

  • Чтение первого файла для формирования списка пар (имя, путь).
  • Обработка второго файла, чтобы заменить значение в строках на основе имени, извлеченного из первого файла.
  • Убедиться, что оба файла имеют ожидаемую структуру и правильные данные для избегания ошибок.

Пример

У вас есть два файла:

  • File 1 содержит список данных в формате "Имя Путь", например:

    Dog /Game/Meshes/Bulldog
    Fish /Game/Meshes/Goldfish
    Cat /Game/Meshes/Cat
  • File 2 содержит строки для изменения:

    StaticMesh=StaticMesh'Dog'
    StaticMesh=StaticMesh'Fish'
    StaticMesh=StaticMesh'Cat'

Вы хотите преобразовать их следующим образом:

StaticMesh=StaticMesh'/Game/Meshes/Bulldog'
StaticMesh=StaticMesh'/Game/Meshes/Goldfish'
StaticMesh=StaticMesh'/Game/Meshes/Cat'

Применение

Ваша текущая реализация Python-скрипта вызывает IndexError: list index out of range. Это случается, когда words имеет меньше элементов, чем вы ожидаете, обычно из-за пустых строк или строк, содержащих только одно слово. Давайте предложим улучшенное решение с учетом данной проблемы:

import re

def main():
    file_one = "file-1.txt"
    file_two = 'file-2.txt'

    # Список для хранения пар (имя, путь)
    word_tuples = []

    try:
        # Чтение и обработка File 1
        with open(file_one, 'r') as file:
            for line in file:
                # Пропускаем пустые строки
                line = line.strip()
                if not line:
                    continue
                words = line.split(maxsplit=1)  # Ограничение на максимум 2 элемента
                if len(words) == 2:
                    word_tuples.append((words[0], words[1]))
                else:
                    print(f"Некорректная строка в {file_one}: {line}")

        # Чтение и замена содержимого File 2
        with open(file_two, 'r') as file:
            for line in file:
                match = re.search(r"StaticMesh=StaticMesh'(.+)'", line)
                if match:
                    quoted_word = match.group(1)
                    for word_tuple in word_tuples:
                        if word_tuple[0] == quoted_word:
                            new_line = line.replace(quoted_word, word_tuple[1])
                            print(new_line.strip())

    except FileNotFoundError as e:
        print(f"Ошибка: файл не найден - {e.filename}")
    except Exception as e:
        print(f"Неизвестная ошибка: {e}")

if __name__ == '__main__':
    main()

Объяснение

  1. Использование strip(): Пропускаем любые пустые строки или строки, содержащие только пробелы.
  2. Ограниченное разбиение: split(maxsplit=1) гарантирует, что текст будет разделен на две части — имя и путь.
  3. Обработка исключений: Ловим и обрабатываем ошибки, если файл не найден или данные не в ожидаемом формате.
  4. Регулярные выражения: Использование re.search для простоты извлечения ключевых слов, которые требуют замены.

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

Оцените материал
Добавить комментарий

Капча загружается...