Stellen Sie die Zeile an den Anfang einer Datei

75

Ich kann dies mit einer separaten Datei tun, aber wie füge ich eine Zeile an den Anfang einer Datei an?

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

Dies beginnt am Ende der Datei zu schreiben, da die Datei im Anhänge-Modus geöffnet wird.

Illusionist
quelle
6
Mögliches Duplikat von Python f.write () am Dateianfang?
Wooble
1
Nein, es ist keine Lösung, da der Link nicht zum Anhängen von Dateien verwendet werden kann. Er bleibt in der letzten Zeile.
Rikudo Pain

Antworten:

107

In den Modi 'a'oder 'a+'wird am Ende der Datei geschrieben, auch wenn sich write()der Zeiger der Datei zum aktuellen Zeitpunkt, zu dem die Funktion ausgelöst wird, nicht am Ende der Datei befindet: Der Zeiger wird vor dem Schreiben an das Ende der Datei verschoben . Sie können auf zwei Arten tun, was Sie wollen.

1. Weg , kann verwendet werden, wenn es keine Probleme gibt, die Datei in den Speicher zu laden:

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. Weg :

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,

Ich weiß nicht, wie diese Methode unter der Haube funktioniert und ob sie für große Dateien verwendet werden kann. Das an die Eingabe übergebene Argument 1 ermöglicht das Umschreiben einer Zeile an Ort und Stelle. Die folgenden Zeilen müssen vorwärts oder rückwärts verschoben werden, damit der Inplace-Vorgang ausgeführt wird, aber ich kenne den Mechanismus nicht

eyquem
quelle
2
with open(filename,'r+') as f:wird die Datei schließen?
Tom Brito
6
@TomBrito Ja, die neue withAnweisung ermöglicht es Ihnen , gemeinsamen vermeiden try/ except/ finallyStandardcode. Es wurde in der Python-Version hinzugefügt 2.5.
Jesse Webb
1
Der erste Weg entfernt die erste Zeile.
SanketDG
@SanketDG Gilt das für die neueste Antwort? Ich sehe dieses Verhalten bei der ersten Methode nicht.
Dave C
16

In allen mir vertrauten Dateisystemen können Sie dies nicht direkt tun. Sie müssen eine Zusatzdatei verwenden (die Sie dann umbenennen können, um den Namen der Originaldatei zu übernehmen).

NPE
quelle
10

Um die Antwort von NPE mit Code zu versehen, ist meiner Meinung nach der effizienteste Weg, dies zu tun:

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)
jeffpkamp
quelle
2
Katastrophal! Kopieren Sie die gesamte Datei mit der Zeile in eine neue.
Tony Tannous
11
@TonyTannous Wenn Sie eine Möglichkeit haben, darauf zu verzichten, teilen Sie diese bitte mit. Ich weiß, dass viele Leute interessiert wären.
Jeffpkamp
8

Andere Idee:

(1) Sie speichern die Originaldatei als Variable.

(2) Sie überschreiben die Originaldatei mit neuen Informationen.

(3) Sie hängen die Originaldatei an die Daten unter den neuen Informationen an.

Code:

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)
lloyd
quelle
3

Es gibt keine Möglichkeit, dies mit integrierten Funktionen zu tun, da dies furchtbar ineffizient wäre. Sie müssen den vorhandenen Inhalt der Datei jedes Mal nach unten verschieben, wenn Sie vorne eine Zeile hinzufügen.

Es gibt ein Unix / Linux-Dienstprogramm, taildas am Ende einer Datei lesen kann. Vielleicht finden Sie das in Ihrer Anwendung nützlich.

Mark Ransom
quelle
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
Kevin Mbugua
quelle
3

Der klare Weg, dies zu tun, ist wie folgt, wenn es Ihnen nichts ausmacht, die Datei erneut zu schreiben

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

Beachten Sie, dass dies kein direkter Ersatz ist. Es wird wieder eine Datei geschrieben.

Zusammenfassend können Sie eine Datei lesen und in einer Liste speichern, die Liste ändern und die Liste erneut in eine neue Datei mit demselben Dateinamen schreiben.

Joonho Park
quelle
1
with open("fruits.txt", "r+") as file:
    file.write("bab111y")
    file.seek(0)
    content = file.read()
    print(content)
Gopi Srikanth
quelle
0

Wenn die Datei zu groß ist, um als Liste verwendet zu werden, und Sie sie einfach umkehren möchten, können Sie die Datei zunächst in umgekehrter Reihenfolge schreiben und dann jeweils eine Zeile ab dem Ende der Datei lesen (und in eine andere Datei schreiben) ) mit File-Read-Backwards-Modul

Gilad Deutsch
quelle