Изменить первую строку файла в python
Мне нужно только прочитать первую строку огромного файла и изменить его.
Есть ли трюк, чтобы изменить только первую строку файла и сохранить его как другой файл с помощью Python? Весь мой код выполняется в python и поможет мне сохранить согласованность.
Идея состоит в том, чтобы не читать, а затем писать весь файл.
Ответы
Ответ 1
shutil.copyfileobj()
должно быть намного быстрее, чем выполнение строки за строкой. Примечание из документов:
Обратите внимание, что если текущая позиция файла объекта [from_file] не равна 0, только содержимое из текущей позиции файла до конца файл будет скопирован.
Таким образом:
import shutil
from_file = open("filename")
line = from_file.readline()
# make any changes to line here
to_file = open("filename",mode="w")
to_file.write(line)
shutil.copyfileobj(from_file, to_file)
Ответ 2
Если новая строка не имеет такой же длины, как и старая строка, вы не сможете этого сделать. Если это так, вы можете решить эту проблему с помощью mmap.
Ответ 3
Если вы хотите изменить верхнюю строку файла и сохранить его под новым именем файла, невозможно просто изменить первую строку без итерации по всему файлу. С яркой стороны, пока вы не печатаете на терминале, изменение первой строки файла ОЧЕНЬ, ОЧЕНЬ быстро даже на больших больших файлах.
Предполагая, что вы работаете с текстовыми файлами (не бинарными), это должно соответствовать вашим потребностям и работать достаточно хорошо для большинства приложений.
import os
newline = os.linesep # Defines the newline based on your OS.
source_fp = open('source-filename', 'r')
target_fp = open('target-filename', 'w')
first_row = True
for row in source_fp:
if first_row:
row = 'the first row now says this.'
first_row = False
target_fp.write(row + newline)
Ответ 4
Альтернативное решение, которое не требует итерации по линиям, которые не представляют интереса.
def replace_first_line( src_filename, target_filename, replacement_line):
f = open(src_filename)
first_line, remainder = f.readline(), f.read()
t = open(target_filename,"w")
t.write(replacement_line + "\n")
t.write(remainder)
t.close()
Ответ 5
Решение, которое я бы использовал, - это использовать файл, отсутствующий в старой строке
from_file.readline() # and discard
shutil.copyfileobj(from_file, tail_file)
затем создайте файл с новой первой строкой
затем используйте следующую команду для конкатенации файла newfirstline и файла tail_file
for f in ['newfirstline.txt','tail_file.txt']:
with open(f,'rb') as fd:
shutil.copyfileobj(fd, wfd, 1024*1024*10
Ответ 6
Модуль sh
работал у меня:
import sh
first = "new string"
sh.sed("-i", "1s/.*/" + first + "/", "file.x")