Wie hängt man eine Datei in Python an?

1574

Wie hängen Sie die Datei an, anstatt sie zu überschreiben? Gibt es eine spezielle Funktion, die an die Datei angehängt wird?

Petter
quelle

Antworten:

2448
with open("test.txt", "a") as myfile:
    myfile.write("appended text")
Petter
quelle
10
Dies aus dem Tutorial kann ebenfalls nützlich sein.
Dan
28
Mir ist aufgefallen, dass viele Leute die with open(file, "a")Methode anwenden. Ich bin vielleicht altmodisch, aber was ist der Vorteil gegenüberopen(file, "a") ... file.close()
75
bluewoodtree: Die Vorteile ähneln denen von RAII in C ++. Wenn Sie close () vergessen, kann es eine Weile dauern, bis die Datei tatsächlich geschlossen wird. Es ist einfacher, dass Sie denken, es zu vergessen, wenn der Code mehrere Austrittspunkte, Ausnahmen usw. hat.
Petter
54
print("appended text", file=myfile)ist auch für eine bekanntere API möglich.
Thomas Ahle
206

Sie müssen die Datei im Anhänge-Modus öffnen, indem Sie "a" oder "ab" als Modus festlegen. Siehe open () .

Wenn Sie im Modus "a" öffnen, befindet sich die Schreibposition immer am Ende der Datei (Anhängen). Sie können mit "a +" öffnen, um das Lesen zu ermöglichen, rückwärts zu suchen und zu lesen (aber alle Schreibvorgänge befinden sich noch am Ende der Datei!).

Beispiel:

>>> with open('test1','wb') as f:
        f.write('test')
>>> with open('test1','ab') as f:
        f.write('koko')
>>> with open('test1','rb') as f:
        f.read()
'testkoko'

Hinweis : Die Verwendung von 'a' ist nicht dasselbe wie das Öffnen mit 'w' und das Suchen bis zum Ende der Datei. Überlegen Sie, was passieren kann, wenn ein anderes Programm die Datei öffnet und zwischen dem Suchen und dem Schreiben mit dem Schreiben beginnt. Unter einigen Betriebssystemen garantiert das Öffnen der Datei mit 'a', dass alle folgenden Schreibvorgänge atomar an das Ende der Datei angehängt werden (auch wenn die Datei durch andere Schreibvorgänge wächst).


Einige weitere Details zur Funktionsweise des "a" -Modus ( nur unter Linux getestet ). Selbst wenn Sie zurück suchen, wird jeder Schreibvorgang an das Ende der Datei angehängt:

>>> f = open('test','a+') # Not using 'with' just to simplify the example REPL session
>>> f.write('hi')
>>> f.seek(0)
>>> f.read()
'hi'
>>> f.seek(0)
>>> f.write('bye') # Will still append despite the seek(0)!
>>> f.seek(0)
>>> f.read()
'hibye'

In der Tat heißt es auf der fopen Manpage :

Das Öffnen einer Datei im Append-Modus (a als erstes Zeichen des Modus) führt dazu, dass alle nachfolgenden Schreibvorgänge in diesen Stream am Dateiende ausgeführt werden, als ob sie dem Aufruf vorausgehen:

fseek(stream, 0, SEEK_END);

Alte vereinfachte Antwort (nicht verwendet with):

Beispiel: ( in einem realen Programm verwenden , withum die Datei zu schließen - siehe die Dokumentation )

>>> open("test","wb").write("test")
>>> open("test","a+b").write("koko")
>>> open("test","rb").read()
'testkoko'
sinelaw
quelle
49

Ich mache das immer,

f = open('filename.txt', 'a')
f.write("stuff")
f.close()

Es ist einfach, aber sehr nützlich.

Seth Connell
quelle
12
Es ist ein bisschen schöner und ein bisschen sicherer zu schreiben: mit open ('Dateiname', 'a') als f: f.write ('stuff')
Sam Redway
35

Sie möchten wahrscheinlich "a"als Modusargument übergeben. Siehe open () in den Dokumenten .

with open("foo", "a") as f:
    f.write("cool beans...")

Es gibt andere Permutationen des Modusarguments zum Aktualisieren (+), Abschneiden (w) und Binärmodus (b), aber mit nur zu beginnen "a"ist die beste Wahl.

istruble
quelle
20
filebeschattet eine eingebaute Funktion. Verwenden Sie es nicht für Variablen.
Mark Tolonen
11
@MarkTolonen: fileist in Python 3 nicht mehr integriert. Selbst in Python 2 wird es sehr selten verwendet . Das Öffnen einer Datei ist eine übliche Operation. Es ist in Ordnung, filehier sowohl in Python 2 als auch in
JFS
34

Python hat viele Variationen der drei Hauptmodi. Diese drei Modi sind:

'w'   write text
'r'   read text
'a'   append text

Das Anhängen an eine Datei ist also so einfach wie:

f = open('filename.txt', 'a') 
f.write('whatever you want to write here (in append mode) here.')

Dann gibt es die Modi, die Ihren Code nur weniger Zeilen machen:

'r+'  read + write text
'w+'  read + write text
'a+'  append + read text

Schließlich gibt es die Modi Lesen / Schreiben im Binärformat:

'rb'  read binary
'wb'  write binary
'ab'  append binary
'rb+' read + write binary
'wb+' read + write binary
'ab+' append + read binary
Cleve Green
quelle
14

wenn wir diese Linie benutzen open(filename, "a"), dasa bedeutet die Datei angehängt wird. bedeutet, dass zusätzliche Daten in die vorhandene Datei eingefügt werden können.

Sie können einfach die folgenden Zeilen verwenden, um den Text in Ihrer Datei anzuhängen

def FileSave(filename,content):
    with open(filename, "a") as myfile:
        myfile.write(content)

FileSave("test.txt","test1 \n")
FileSave("test.txt","test2 \n")
K. Suthagar
quelle
9

Sie können es auch mit tun printstatt write:

with open('test.txt', 'a') as f:
    print('appended text', file=f)

Wenn test.txt nicht existiert, wird es erstellt ...

Alaa M.
quelle
6

Sie können die Datei auch im r+Modus öffnen und dann die Dateiposition auf das Ende der Datei setzen.

import os

with open('text.txt', 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Wenn Sie die Datei im r+Modus öffnen, können Sie neben dem Ende an andere Dateipositionen schreiben aund das a+Schreiben bis zum Ende erzwingen.

Primusa
quelle
4

Wenn Sie an eine Datei anhängen möchten

with open("test.txt", "a") as myfile:
    myfile.write("append me")

Wir haben die Variable deklariert myfile, um eine Datei mit dem Namen zu öffnen test.txt. Open benötigt zwei Argumente, die Datei, die wir öffnen möchten, und eine Zeichenfolge, die die Arten von Berechtigungen oder Operationen darstellt, die wir für die Datei ausführen möchten

Hier finden Sie Optionen für den Dateimodus

Modusbeschreibung

'r' Dies ist der Standardmodus. Es öffnet die Datei zum Lesen.
'w' Dieser Modus Öffnet die Datei zum Schreiben. 
Wenn keine Datei vorhanden ist, wird eine neue Datei erstellt.
Wenn eine Datei vorhanden ist, wird die Datei abgeschnitten.
'x' Erstellt eine neue Datei. Wenn die Datei bereits vorhanden ist, schlägt der Vorgang fehl.
'a' Datei im Anhänge-Modus öffnen. 
Wenn keine Datei vorhanden ist, wird eine neue Datei erstellt.
't' Dies ist der Standardmodus. Es wird im Textmodus geöffnet.
'b' Dies wird im Binärmodus geöffnet.
'+' Dies öffnet eine Datei zum Lesen und Schreiben (Aktualisieren)
Nima Moradi
quelle
4

Der 'a'Parameter kennzeichnet den Append-Modus. Wenn Sie nicht with openjedes Mal verwenden möchten , können Sie einfach eine Funktion schreiben, die dies für Sie erledigt:

def append(txt='\nFunction Successfully Executed', file):
    with open(file, 'a') as f:
        f.write(txt)

Wenn Sie an einer anderen Stelle als am Ende schreiben möchten, können Sie 'r+'† verwenden :

import os

with open(file, 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Schließlich 'w+'gewährt der Parameter noch mehr Freiheit. Insbesondere können Sie die Datei erstellen, wenn sie nicht vorhanden ist, und den Inhalt einer aktuell vorhandenen Datei leeren.


† Die Gutschrift für diese Funktion geht an @Primusa

Alec Alameddine
quelle
2

Der einfachste Weg, mehr Text an das Ende einer Datei anzuhängen, ist die Verwendung von:

with open('/path/to/file', 'a+') as file:
    file.write("Additions to file")
file.close()

Die Anweisung a+in der open(...)Anweisung weist an, die Datei im Anhänge-Modus zu öffnen, und ermöglicht Lese- und Schreibzugriff.

Es wird auch immer empfohlen, file.close()alle Dateien zu schließen, die Sie geöffnet haben, sobald Sie sie verwendet haben.

mattc-7
quelle
1
"file.close" wird automatisch am Ende des "with" -Blocks aufgerufen, was der Vorteil des Schlüsselworts ist. Außerdem fragte das OP nach dem Öffnen einer Datei zum Anhängen. Der "+" - Modus ist nur erforderlich, wenn Sie ebenfalls lesen möchten.
Erik Knowles
-6

Hier ist mein Skript, das im Grunde die Anzahl der Zeilen zählt, dann anhängt und sie dann erneut zählt, damit Sie Beweise dafür haben, dass es funktioniert hat.

shortPath  = "../file_to_be_appended"
short = open(shortPath, 'r')

## this counts how many line are originally in the file:
long_path = "../file_to_be_appended_to" 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines initially" %(long_path,i)
long.close()

long = open(long_path, 'a') ## now open long file to append
l = True ## will be a line
c = 0 ## count the number of lines you write
while l: 
    try: 
        l = short.next() ## when you run out of lines, this breaks and the except statement is run
        c += 1
        long.write(l)

    except: 
        l = None
        long.close()
        print "Done!, wrote %s lines" %c 

## finally, count how many lines are left. 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines after appending new lines" %(long_path, i)
long.close()
Reiseknochen
quelle