Comment ajouter un fichier en Python?

1574

Comment ajoutez-vous au fichier au lieu de l'écraser? Y a-t-il une fonction spéciale qui s'ajoute au fichier?

Petter
la source

Réponses:

2448
with open("test.txt", "a") as myfile:
    myfile.write("appended text")
Petter
la source
10
Cela provenant du didacticiel peut également être utile.
Dan
28
J'ai remarqué que beaucoup de gens utilisent la with open(file, "a")méthode. Je suis peut-être démodé, mais quel est l'avantage suropen(file, "a") ... file.close()
75
bluewoodtree: Les avantages sont similaires à ceux de RAII en C ++. Si vous oubliez close (), cela peut prendre un certain temps avant que le fichier ne soit réellement fermé. Il est plus facile de penser à l'oublier lorsque le code a plusieurs points de sortie, des exceptions, etc.
Petter
54
print("appended text", file=myfile)est également possible, pour une API plus familière.
Thomas Ahle
206

Vous devez ouvrir le fichier en mode ajout, en définissant "a" ou "ab" comme mode. Voir open () .

Lorsque vous ouvrez avec le mode "a", la position d'écriture sera toujours à la fin du fichier (un ajout). Vous pouvez ouvrir avec "a +" pour permettre la lecture, la recherche en arrière et la lecture (mais toutes les écritures seront toujours à la fin du fichier!).

Exemple:

>>> 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'

Remarque : L'utilisation de 'a' n'est pas la même chose que l'ouverture avec 'w' et la recherche à la fin du fichier - réfléchissez à ce qui pourrait arriver si un autre programme ouvrait le fichier et commençait à écrire entre la recherche et l'écriture. Sur certains systèmes d'exploitation, l'ouverture du fichier avec «a» garantit que toutes vos écritures suivantes seront ajoutées atomiquement à la fin du fichier (même si le fichier se développe par d'autres écritures).


Quelques détails supplémentaires sur le fonctionnement du mode "a" ( testé sur Linux uniquement ). Même si vous cherchez en arrière, chaque écriture s'ajoutera à la fin du fichier:

>>> 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'

En fait, la fopen page de manuel déclare:

L'ouverture d'un fichier en mode ajout (a comme premier caractère du mode) provoque toutes les opérations d'écriture suivantes dans ce flux à la fin du fichier, comme si elles avaient précédé l'appel:

fseek(stream, 0, SEEK_END);

Ancienne réponse simplifiée (ne pas utiliser with):

Exemple: ( dans un programme réel, utilisez withpour fermer le fichier - voir la documentation )

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

Je fais toujours ça,

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

C'est simple, mais très utile.

Seth Connell
la source
12
c'est un peu plus agréable et un peu plus sûr d'écrire: avec open ('filename', 'a') comme f: f.write ('stuff')
Sam Redway
35

Vous voulez probablement passer "a"comme argument de mode. Voir les documents pour open () .

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

Il existe d'autres permutations de l'argument mode pour la mise à jour (+), la troncature (w) et le mode binaire (b), mais commencer avec juste "a"est votre meilleur pari.

dérangeant
la source
20
fileassocie une fonction intégrée. Ne l'utilisez pas pour les variables.
Mark Tolonen
11
@MarkTolonen: filen'est plus un module intégré dans Python 3. Même dans Python 2, il est très rarement utilisé . L'ouverture d'un fichier est une opération courante. Il est correct d'utiliser le filenom ici sur Python 2 et 3. Sachez quand être incohérent.
jfs
34

Python a de nombreuses variantes des trois principaux modes, ces trois modes sont:

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

Donc, pour ajouter à un fichier, c'est aussi simple que:

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

Ensuite, il y a les modes qui rendent votre code moins de lignes:

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

Enfin, il existe les modes de lecture / écriture au format binaire:

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

lorsque nous utilisons cette ligne open(filename, "a"), qui aindique l'ajout du fichier, cela signifie permettre d'insérer des données supplémentaires dans le fichier existant.

Vous pouvez simplement utiliser les lignes suivantes pour ajouter le texte dans votre fichier

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
la source
9

Vous pouvez également le faire avec printau lieu de write:

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

Si test.txt n'existe pas, il sera créé ...

Alaa M.
la source
6

Vous pouvez également ouvrir le fichier en r+mode, puis définir la position du fichier à la fin du fichier.

import os

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

Ouverture du fichier en r+mode vous permettre d' écrire à d' autres postes de fichiers en dehors de la fin, alors que aet l' a+écriture de force à la fin.

Primusa
la source
4

si vous souhaitez ajouter à un fichier

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

Nous avons déclaré la variable myfilepour ouvrir un fichier nommétest.txt . Ouvrir prend 2 arguments, le fichier que nous voulons ouvrir et une chaîne qui représente les types de permission ou d'opération que nous voulons faire sur le fichier

voici les options du mode fichier

Description du mode

'r' C'est le mode par défaut. Il ouvre le fichier pour la lecture.
'w' Ce mode ouvre le fichier pour l'écriture. 
Si le fichier n'existe pas, il crée un nouveau fichier.
Si le fichier existe, il tronque le fichier.
'x' Crée un nouveau fichier. Si le fichier existe déjà, l'opération échoue.
'a' Ouvrir un fichier en mode ajout. 
Si le fichier n'existe pas, il crée un nouveau fichier.
't' C'est le mode par défaut. Il s'ouvre en mode texte.
'b' Cela s'ouvre en mode binaire.
'+' Cela ouvrira un fichier pour la lecture et l'écriture (mise à jour)
nima moradi
la source
4

Le 'a'paramètre signifie le mode d'ajout. Si vous ne souhaitez pas utiliser à with openchaque fois, vous pouvez facilement écrire une fonction pour le faire pour vous:

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

Si vous voulez écrire ailleurs que la fin, vous pouvez utiliser 'r+' :

import os

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

Enfin, le 'w+'paramètre accorde encore plus de liberté. Plus précisément, il vous permet de créer le fichier s'il n'existe pas, ainsi que de vider le contenu d'un fichier qui existe actuellement.


† Le crédit pour cette fonction va à @Primusa

Alec Alameddine
la source
2

La façon la plus simple d'ajouter plus de texte à la fin d'un fichier serait d'utiliser:

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

L' instruction a+dans l' open(...)instruction indique d'ouvrir le fichier en mode ajout et autorise l'accès en lecture et en écriture.

Il est également toujours recommandé file.close()de fermer tous les fichiers que vous avez ouverts une fois que vous avez fini de les utiliser.

mattc-7
la source
1
"file.close" est automatiquement appelé à la fin du bloc "with", ce qui est l'avantage du mot-clé. Le PO a également demandé l'ouverture d'un fichier à ajouter. Le mode "+" n'est pas nécessaire, sauf si vous souhaitez également lire.
Erik Knowles
-6

Voici mon script, qui compte essentiellement le nombre de lignes, puis les ajoute, puis les compte à nouveau pour que vous ayez des preuves que cela a fonctionné.

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()
os de voyage
la source