этот ответ из изменить первую строку файла в python , с которого вы скопировали, не работает в windows
В Linux вы можете открыть файл дляЧтение и запись одновременно.Система гарантирует отсутствие конфликта, но за кулисами обрабатываются 2 различных файловых объектов.И этот метод очень небезопасен: если происходит сбой программы во время чтения / записи (отключение питания, диск заполнен) ... у файла есть большой шанс быть усеченным / поврежденным.
В любом случаев Windows вы не можете открыть файл для чтения и записи одновременно, используя 2 маркера.Он просто уничтожает содержимое файла.
Таким образом, есть 2 варианта, которые являются переносимыми и безопасными:
- создать файл в том же каталоге, после копирования скопировать, удалить первый файли переименуйте новую
Примерно так:
import os
import shutil
filepath = "test.txt"
with open(filepath) as from_file, open(filepath+".new","w") as to_file:
data = from_file.readline()
to_file.write("something else\n")
shutil.copyfileobj(from_file, to_file)
os.remove(filepath)
os.rename(filepath+".new",filepath)
Это не займет много времени, поскольку операция rename
выполняется мгновенно.Кроме того, если программа / компьютер дает сбой в любой момент, один из файлов (старый или новый) является действительным, поэтому он безопасен.
если шаблоны имеют одинаковую длину, используйте режим чтения / записи
следующим образом:
filepath = "test.txt"
with open(filepath,"r+") as rw_file:
data = rw_file.readline()
data = "h"*(len(data)-1) + "\n"
rw_file.seek(0)
rw_file.write(data)
Здесь мы, читая строку, заменяем первую строку на ту жеколичество h
символов, перемотайте файл и напишите первую строку назад, перезаписав предыдущее содержимое, сохранив оставшиеся строки.Это также безопасно, и даже если файл огромен, он очень быстрый.Единственным ограничением является то, что шаблон должен быть точно такого же размера (иначе у вас будут остатки предыдущих данных, или вы перезапишете следующую строку (и), так как данные не сдвинуты)