Запись редактирования в файл удаляет содержимое вместо его редактирования

#python #python-3.x #list #function #fwrite

#python #python-3.x #Список #функция #fwrite

Вопрос:

Проблема: удаляет содержимое из целевого файла вместо редактирования и сохранения файла (исходное содержимое отредактированное содержимое)

Хочу: Надеюсь, что исправление будет как можно ближе к funcB, поскольку для меня это эксперимент

 #IMPORTS
import json
import os

#EXTERNAL VARIABLES/FUNCTIONS
cdl = str(os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__))) os.sep)
GetFileCont = lambda filename, extension="txt", dir=cdl: list(open(str(dir) str(filename) "." str(extension)))

#FUNCTION TO FIX
def FuncB(filename:str, extension:str, line:int, new_data, dir=cdl):  # <--- After
    open(
        str(dir) str(filename) "." extension, "w"
        ).writelines(
            [new_data "n" if (i 1)==line else v for i, v in enumerate(GetFileCont(str(filename), extension))]
            )
  

Пробовал: я пробовал долгий путь (да, он работает хорошо), я просто хочу попробовать и посмотреть, смогу ли я сделать это таким образом

 #OTHER WAY TO COMPLETE THE BROKEN FUNCTION
def FuncA(filename, extension, line, new_data, dir=cdl):  # <--- Before
    data = GetFileCont(str(filename), extension)
    data[line-1] = new_data "n"
    with open(str(dir) str(filename) "." extension, "w") as f:
        f.writelines(data)
    f.close()
  

Ответ №1:

Вы не можете сделать это как однострочный вариант. Аргумент to writelines() не вычисляется до open() тех пор, пока не вернется after , и когда вы вызываете open() с w помощью mode, он усекает файл. Итак, вы пытаетесь прочитать файл после его очистки.

Вместо этого вы можете использовать r mode . Это открывает файл в режиме чтения-записи без его очистки. Однако, если новое содержимое короче старого, вы не будете удалять конечные данные.

Придерживайтесь второй версии. Он более удобочитаемый и работает так, как ожидалось.