Вопрос или проблема
У меня есть два текстовых файла. Файл 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()
Ответ или решение
Добрый день,
Ваш вопрос касается автоматизации процесса обновления содержимого файла путем замены конкретных текстовых строк на основе данных из другого файла. Вы сталкиваетесь с распространенной задачей обработки текстовых файлов и использованием их содержимого для генерации новых данных. Давайте разберем все аспекты этой задачи, начиная с понимания теории и причин возникновения ошибки, и заканчивая предложением надежного решения.
Теория
Проблема, с которой вы столкнулись, имеет несколько основных компонентов:
- Файловая обработка – чтение данных из текстовых файлов, которые содержат ключевые данные для выполнения замен.
- Манипуляция строками – необходимо изменять содержимое текста, основываясь на специфичных правилах.
- Регулярные выражения – используются для поиска и извлечения нужной информации в строках.
Основные этапы решения это задачи:
- Чтение первого файла для формирования списка пар (имя, путь).
- Обработка второго файла, чтобы заменить значение в строках на основе имени, извлеченного из первого файла.
- Убедиться, что оба файла имеют ожидаемую структуру и правильные данные для избегания ошибок.
Пример
У вас есть два файла:
-
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()
Объяснение
- Использование
strip()
: Пропускаем любые пустые строки или строки, содержащие только пробелы. - Ограниченное разбиение:
split(maxsplit=1)
гарантирует, что текст будет разделен на две части — имя и путь. - Обработка исключений: Ловим и обрабатываем ошибки, если файл не найден или данные не в ожидаемом формате.
- Регулярные выражения: Использование
re.search
для простоты извлечения ключевых слов, которые требуют замены.
Данная реализация обеспечит, чтобы программа корректно обрабатывала строки и избегала ошибок, связанных с некорректными данными. Надеюсь, это поможет вам эффективно решить задачу. Если у вас остались вопросы или требуются дополнительные примеры, не стесняйтесь уточнять.