2011-07-29 6 views
6

Je viens d'avoir une pensée passagère et je me suis demandé quel meilleur endroit pour demander ici. Par curiosité, personne ne sait si l'ouverture d'un fichier pour append, comme ceci:Ouverture d'un fichier pour ajouter

file_name = "abc" 
file_handle = open(file_name,"a") 

est essentiellement le même que l'ouverture d'un fichier pour l'écriture et la recherche à la fin:

file_name = "abc" 
file_handle = open(file_name,"w") 
file_handle.seek(0,2) # 0 for offset, 2 for end-of-file 

Je suis Je me demandais simplement si l'ouverture d'un fichier pour append est essentiellement en train de faire le deuxième bloc, ouvert pour l'écriture suivie d'une recherche à la fin du fichier, dans les coulisses.

+0

Comment pouvez-vous discerner la différence? –

Répondre

15

Après avoir joué un peu dans mon terminal, je peux dire quelles sont les différences sur linux ubuntu 11.04 en utilisant python 2.7.1.

ouverture avec tronque « w » (à savoir efface le contenu de) le fichier dès qu'il est ouvert. En d'autres termes, il suffit d'ouvrir le fichier avec open('file.txt', 'w') et de quitter les feuilles derrière un fichier vide.

Ouverture avec « a » laisse le contenu du fichier intact. Donc, l'ouverture avec open('file.txt', 'a') et la sortie laisse le fichier inchangé.

Cela vaut également pour les options de mise à jour pour ouvrir. La commande open('file.txt', 'w+') laissera un fichier vide, tandis que les commandes open('file.txt', 'r+') et open('file.txt', 'a+') laisseront des fichiers inchangés.

La différence entre les options de r + 'et « a + » est le comportement que les autres ont suggéré. L'option 'r +' vous permet d'écrire n'importe où dans le fichier, tandis que 'a +' force toutes les écritures à la fin du fichier, quel que soit l'endroit où vous définissez la position actuelle du fichier.

Si vous souhaitez en savoir plus, selon le python documentation la fonction ouverte accepte les modes similaires à the fopen function de stdio C. "W" effacera les données de contenu, puis recherchera la position finale.

+0

bon point avec un seul 'w'; il devrait être 'r +' si nous voulons ouvrir le fichier pour la mettre à jour sans le tronquer. – tomasz

+0

@tomasz Je ne sais pas de quoi vous parlez. Afaik, python n'a pas d'option 'rw' pour l'ouverture. A moins que vous ne parliez des options de mise à jour ('r +', 'w +', etc.) qui ont le même effet que ci-dessus. – cledoux

+0

karategeek6: tu as raison, j'ai modifié mon commentaire avec 'r +' juste après l'avoir quitté! – tomasz

2

Pas vraiment. En utilisant append force toutes les écritures pour aller à la fin du fichier, où vous pouvez chercher à un autre endroit avec une écriture.

1

Cela dépend du système sur lequel vous travaillez; l'ouverture d'un fichier avec l'indicateur d'ajout signifie souvent que vous allez écrire à la fin du fichier indépendamment de la position du pointeur d'écriture. En d'autres termes, cela peut signifier que votre système d'exploitation doit effectuer une recherche à la fin du fichier avant chaque écriture ou simplement rechercher le pointeur vers la fin après l'ouverture. Vous pouvez facilement vérifier comment cela fonctionne sous votre environnement, mais le seul comportement garanti est la recherche de la fin après l'ouverture.

EDIT: Comme d'autres l'ont souligné, w drapeau tronque effectivement le fichier. Si vous souhaitez l'ouvrir pour la mise à jour sans supprimer le contenu actuel, vous devrez utiliser le flag r+ (mais alors la lecture sera autorisée ce qui n'est pas vrai pour a).

2

Donc, vous finirez avec un fichier vide avec un pointeur sur BOF et non sur EOF. Utilisez "A" pour conserver les anciennes données.