Изменить первую строку файла в 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")