Додати рядок до початку файлу


76

Я можу зробити це за допомогою окремого файлу, але як додати рядок на початок файлу?

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

Запис починається з кінця файлу, оскільки файл відкривається в режимі додавання.


6

1
Ні, це не рішення в тому, що посилання не може використовуватися для додавання файлу, воно буде триматися в останньому рядку.
Рікудо Пейн,

Відповіді:


109

У режимах '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, переданий на введення, є тим, що дозволяє переписати рядок на місці; наступні рядки потрібно переміщати вперед або назад, щоб відбулася операція inplace, але я не знаю механізму


2
with open(filename,'r+') as f:закриє файл?
Tom Brito

6
@TomBrito Так, новий withвираз дозволяє уникнути загального try/ except/ finallyтипового коду. Він був доданий у версії Python 2.5.
Джессі Вебб,

2
1-й спосіб видаляє перший рядок.
SanketDG

@SanketDG Чи правда це для останньої відповіді? Я не бачу такої поведінки з першим методом.
Dave C,

16

У всіх файлових системах, які мені знайомі, ви не можете зробити це на місці. Ви повинні використовувати допоміжний файл (який потім можна перейменовувати, щоб взяти ім’я оригінального файлу).


13

Щоб застосувати код до відповіді 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)

2
Катастрофічно! Копіювання всього файлу в новий за допомогою рядка.
Тоні Таннус,

11
@TonyTannous, якщо у вас є спосіб зробити це без, будь ласка, поділіться. Я знаю, що багатьом людям було б цікаво.
jeffpkamp

8

Різні ідеї:

(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

Це неможливо зробити за допомогою будь-яких вбудованих функцій, оскільки це було б страшно неефективно. Вам потрібно буде зміщувати наявний вміст файлу вниз кожного разу, коли ви додаєте рядок спереду.

Існує утиліта Unix / Linux, tailяка може читати з кінця файлу. Можливо, ви знайдете це корисно у вашому додатку.


3
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

Ясний спосіб зробити це наступним чином, якщо ви не проти написати файл ще раз

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

Зверніть увагу, що це не заміна на місці. Це знову запис файлу.

Таким чином, ви читаєте файл і зберігаєте його у списку, а також модифікуєте список і знову записуєте список у новий файл із такою ж назвою.



0

Якщо файл занадто великий для використання в якості списку, і ви просто хочете його змінити, ви можете спочатку написати файл у зворотному порядку, а потім прочитати по одному рядку з кінця файлу (і записати його в інший файл). ) з модулем читання файлів назад

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.