Почему неверный вывод добавляется к моему файлу Python?

#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))
  

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


Подробнее о методе join

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

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()
    """))