Добавить строку к началу файла - PullRequest
58 голосов
/ 06 мая 2011

Я могу сделать это, используя отдельный файл, но как мне добавить строку в начало файла?

f=open('log.txt','a')
f.seek(0) #get to the first position
f.write("text")
f.close()

Это начинает запись с конца файла, так как файл открывается в режиме добавления.

Ответы [ 7 ]

83 голосов
/ 07 мая 2011

В режимах 'a' или 'a+' любая запись выполняется в конце файла, даже если в текущий момент, когда запускается функция write(), указатель файла не находится в конце файла:указатель перемещается в конец файла перед любой записью.Вы можете делать то, что хотите, двумя способами.

1-й способ , можно использовать, если нет проблем с загрузкой файла в память:

def line_prepender(filename, line):
    with open(filename, 'r+') as f:
        content = f.read()
        f.seek(0, 0)
        f.write(line.rstrip('\r\n') + '\n' + content)

2-й способ :

def line_pre_adder(filename, line_to_prepend):
    f = fileinput.input(filename, inplace=1)
    for xline in f:
        if f.isfirstline():
            print line_to_prepend.rstrip('\r\n') + '\n' + xline,
        else:
            print xline,

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

16 голосов
/ 06 мая 2011

Во всех файловых системах, с которыми я знаком, вы не можете сделать это на месте.Вы должны использовать вспомогательный файл (который затем можно переименовать, чтобы взять имя исходного файла).

7 голосов
/ 18 февраля 2017

Чтобы добавить код в ответ NPE, я думаю, что наиболее эффективный способ сделать это:

def insert(originalfile,string):
    with open(originalfile,'r') as f:
        with open('newfile.txt','w') as f2: 
            f2.write(string)
            f2.write(f.read())
    os.rename('newfile.txt',originalfile)
5 голосов
/ 29 марта 2018

Другая идея:

(1) Вы сохраняете оригинальный файл как переменную.

(2) Вы перезаписываете оригинальный файл новой информацией.

(3) Вы добавляете исходный файл в данные ниже новой информации.

Код:

with open(<filename>,'r') as contents:
      save = contents.read()
with open(<filename>,'w') as contents:
      contents.write(< New Information >)
with open(<filename>,'a') as contents:
      contents.write(save)
3 голосов
/ 07 февраля 2018
num = [1, 2, 3] #List containing Integers

with open("ex3.txt", 'r+') as file:
    readcontent = file.read()  # store the read value of exe.txt into 
                                # readcontent 
    file.seek(0, 0) #Takes the cursor to top line
    for i in num:         # writing content of list One by One.
        file.write(str(i) + "\n") #convert int to str since write() deals 
                                   # with str
    file.write(readcontent) #after content of string are written, I return 
                             #back content that were in the file
3 голосов
/ 06 мая 2011

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

Есть утилита Unix / Linux tail, которая может читать с конца файла. Возможно, вы найдете это полезным в вашем приложении.

1 голос
/ 21 января 2019

Простой способ сделать это заключается в следующем, если вы не возражаете против повторной записи файла

with open("a.txt", 'r+') as fp:
    lines = fp.readlines()     # lines is list of line, each element '...\n'
    lines.insert(0, one_line)  # you can use any index if you know the line index
    fp.seek(0)                 # file pointer locates at the beginning to write the whole file again
    fp.writelines(lines)       # write whole lists again to the same file

Обратите внимание, что это не замена на месте.Он снова пишет файл.

В итоге вы читаете файл и сохраняете его в список, изменяете список и снова записываете список в новый файл с тем же именем файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...