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

#python #list #file

Вопрос:

У меня есть файл, который мне нужно прочитать и найти любые зарезервированные ключевые слова, которые используются в качестве идентификаторов. Если в качестве идентификатора найдено зарезервированное ключевое слово. Мне нужно добавить res_keyword. Я составил список зарезервированных слов:

keywords =['cos','abs', 'sin','begin','end','input','output'] Итак, если в файле я столкнусь input cos; с тем, что мне нужно изменить его на input res_cos; Это, это то, что у меня есть до сих пор:

 keywords =['cos','abs', 'sin','begin','end','input','output']
with open('filename', 'r') as file:
    data = file.read()
for i in keywords:
    if i == data:
        data = data.replace(keywords, 'res')
with open('filename', 'w') as file:
    file.write(data)
 

Изменить: Вот фрагмент входного файла:

 input cos;
cos = x   y
 

потому что нужно было бы изменить на res_cos

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

1. data это все содержимое файла; оно никогда не будет равным i .

2. Не могли бы вы включить пример входного файла для этого вопроса.

3. @Robson, я добавил фрагмент

4. @AronChabane Отлично, хотя на самом деле этого недостаточно, чтобы сделать из этого какие-то выводы. Предположительно, у вас есть множество способов использования этих ключевых слов. Например, они могут использоваться в качестве имен функций, вызовов функции, имен переменных, присвоения переменной и т. Д. Многими способами. Определение того, когда слово используется в качестве имени, а не в качестве языковой функции, будет огромной и сложной задачей, потому что вам нужно будет проанализировать код и разобраться в каждой ситуации. Я думаю, что для этого было бы лучше рассмотреть альтернативные решения. Зачем вам нужно выполнять эту задачу? Сколько там файлов?

5. Для этого вам следует использовать регулярное выражение, чтобы вы могли сопоставлять целые слова . Попробуйте что-нибудь вроде этого: data = re.sub(rf'b({"|".join(keywords)})b', r'res_1', data) .

Ответ №1:

Ваш вопрос неясен, но, если я не ошибаюсь, я заметил, что Вы делаете это.

 data = data.replace(keywords, 'res')
 

Вы используете keywords список в методе замены, но вам следует сделать что-то вроде этого

 data = data.replace(i, 'res_'   i)
 

Однако это работает, если файл data состоял из одной строки. Когда вы это сделаете

 if i == data:
 

вы рассматриваете data как одну строку, и это никогда не будет иметь значения true, если data только это не одно слово.

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

1. Это изменит не зарезервированные слова, такие как send sres_end .

2. @ekhumoro да, вы правы, я не понимаю, как я мог пропустить что-то подобное. Я думаю, что использование регулярного выражения-лучший вариант, я думаю.