Добавить строку к существующему файлу в Python

Мне нужно добавить одну строку в первую строку текстового файла, и похоже, что единственные доступные мне варианты-это больше строк кода, чем я ожидал бы от python. Что-то вроде этого:--2-->

f = open('filename','r')
temp = f.read()
f.close()

f = open('filename', 'w')
f.write("#testfirstline")

f.write(temp)
f.close()

нет ли более простого способа? Кроме того, я вижу этот пример с двумя дескрипторами чаще, чем открытие одного дескриптора для чтения и записи ("r+")-почему это?

9 ответов


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

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

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

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


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

вместо python2:

with file('filename', 'r') as original: data = original.read()
with file('filename', 'w') as modified: modified.write("new first line\n" + data)

Python3:

with open('filename', 'r') as original: data = original.read()
with open('filename', 'w') as modified: modified.write("new first line\n" + data)

Примечание: функция file () недоступна в python3.


другой подход:

with open("infile") as f1:
    with open("outfile", "w") as f2:
        f2.write("#test firstline")
        for line in f1:
            f2.write(line)

или один вкладыш:

open("outfile", "w").write("#test firstline\n" + open("infile").read())

Спасибо за возможность подумать об этой проблеме:)

Ура


with open("file", "r+") as f: s = f.read(); f.seek(0); f.write("prepend\n" + s)

вы можете сохранить один вызов записи с помощью этого:

f.write('#testfirstline\n' + temp)

при использовании 'r+' вам придется перемотать файл после чтения и перед записью.


вот 3 лайнера, которые я думаю, ясны и гибки. Он использует список.вставьте функцию, поэтому, если вы действительно хотите добавить в файл, используйте l.insert(0, 'insert_str'). Когда я действительно сделал это для модуля Python, который я разрабатываю, я использовал l.insert (1, 'insert_str'), потому что я хотел пропустить"# - - кодирование: utf-8 - - строку в строке 0. Вот код.

f = open(file_path, 'r'); s = f.read(); f.close()
l = s.splitlines(); l.insert(0, 'insert_str'); s = '\n'.join(l)
f = open(file_path, 'w'); f.write(s); f.close()

это делает работу без чтения всего файла в память, хотя он может не работать в Windows

def prepend_line(path, line):
    with open(path, 'r') as old:
        os.unlink(path)
        with open(path, 'w') as new:
            new.write(str(line) + "\n")
            shutil.copyfileobj(old, new)

одна из возможностей заключается в следующем:

import os
open('tempfile', 'w').write('#testfirstline\n' + open('filename', 'r').read())
os.rename('tempfile', 'filename')

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

def prepend_text(file, text, after=None):
    ''' Prepend file with given raw text '''
    f_read = open(file, 'r')
    buff = f_read.read()
    f_read.close()
    f_write = open(file, 'w')
    inject_pos = 0
    if after:
        pattern = after
        inject_pos = buff.find(pattern)+len(pattern)
    f_write.write(buff[:inject_pos] + text + buff[inject_pos:])
    f_write.close()

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