#python #text-files
#python #текстовые файлы
Вопрос:
У меня есть файл python, пытающийся изменить другой файл python здесь:
file = "PythonFile1.py"
with open(file, "r") as current_file:
lines = current_file.readlines()
for line in lines:
if line != 'sys.stdout = open("test.txt", "w")' or line != "sys.stdout.close()" or line != "import sys":
del lines[lines.index(line)]
with open(file, "w") as current_file:
for line in lines:
current_file.write(line)
print(lines)
И вот файл python, который пытаются изменить:
import sys
sys.stdout = open("test.txt", "w")
sys.stdout.close()
Когда я запускаю первый файл python, я получаю этот результат в моем другом файле python.
sys.stdout = open("test.txt", "w")
Я ищу содержимое файла, которое должно быть:
import sys
sys.stdout = open("test.txt", "w")
sys.stdout.close()
Я не уверен, почему он не улавливает строки, которые я хочу сохранить, кто-нибудь может помочь решить эту проблему?
Комментарии:
1. Не рекомендуется менять код с помощью code. Должен быть лучший способ структурировать ваш код, чтобы его не нужно было изменять. Кажется, вы задаете здесь неправильный вопрос. Смотрите xyproblem.info
2. Я использую его для бота discord, который запросит код для записи и запишет его в файл, но мне нужно, чтобы эти строки остались, чтобы вывод был в формате .txt, который я затем могу использовать для отправки выходных данных.
3. Вы планируете запускать их код?
4.
sys.stdout = open("test.txt", "w")
это настоящий python? я не думаю, что это делает то, что вы хотите.5. полностью перезапишите файл тем содержимым, которое вы хотите
Ответ №1:
with open(file, "w") as current_file:
current_file.write('n'.join(lines))
Вам не нужно перебирать его и записывать их, просто соедините строки и напишите один раз напрямую. Когда вы выполняете цикл через него, в каждом цикле вы заменяете то, что уже было в файле, если вы не используете режим добавления. Соедините строки вместе и напишите их напрямую, будет проще.
Комментарии:
1. Это неправда. Он не открывает файл внутри цикла. Он открывается один раз, а затем записывает в цикле. Это полностью стандартно
2. Что вы имеете в виду @Tomerikoo? Я говорил о той части, где OP записывает в файл новые изменения
3. Я говорю о том, что вы сказали: в каждом цикле вы заменяете то, что уже было в файле . Это неправда. Это было бы правдой, если бы он открывал файл с помощью
'w'
внутри цикла, и это каждый раз усекает файл… Он просто записывает в файл в цикле, в этом нет ничего плохого. После каждой записи указатель перемещается, единственное, чего не хватает, это, возможно,'n'
при каждой записи
Ответ №2:
Вот что я бы сделал:
magic_lines = [
"sys.stdout = open('test.txt', 'w')",
"sys.stdout.close()",
"import sys"
]
with open(infilepath, 'r') as infile:
lines = infile.readlines()
with open(infilepath, 'w') as outfile:
for line in lines:
if line.strip() in magic_lines:
outfile.write(line)
Но мне кажется, что вы могли бы полностью удалить и проложить файл:
from textwraps import dedent
with open(infilepath, 'w') as infile:
infile.write(dedent("""
import sys
sys.stdout = open("test.txt", "w")
sys.stdout.close()
"""))