Comment effacer le contenu du fichier du fichier texte en Python?

140

J'ai un fichier texte que je veux effacer en Python. Comment je fais ça?

Péquenaud
la source
les gens qui ont donné les réponses ont dit que ce n'était pas possible .. alors voulez-vous me dire comment le faire facilement en python?
Coup

Réponses:

281

En python:

open('file.txt', 'w').close()

Ou bien, si vous avez déjà un fichier ouvert:

f = open('file.txt', 'r+')
f.truncate(0) # need '0' when using r+

En C ++, vous pouvez utiliser quelque chose de similaire.

ondra
la source
#include<fstream>puis à std::ofstream("file.txt");peu près aussi court qu'en Python. :)
wilhelmtell
8
la raison pour laquelle cela fonctionne (à la fois en C ++ et en python) est que, par défaut, lorsque vous ouvrez un fichier pour l'écriture, cela tronque le contenu existant. Donc, vraiment, c'est en quelque sorte un effet secondaire, et donc je préférerais l'appel explicite à truncate () pour des raisons de clarté, même si ce n'est pas nécessaire.
rmeador
7
si vous avez ouvert le fichier en utilisant "r +", utilisez truncate (0) si vous avez analysé le fichier, ce que vous avez probablement. Ajoutez ceci à la réponse ci-dessus pour qu'elle soit complète!
Johan Engblom
3
utilisez f.seek (0) pour déplacer le pointeur au début du fichier
Johan Engblom
Je lisais ainsi que j'écrivais dans un fichier. La réponse tronque parfaitement le fichier, mais méfiez-vous si vous voulez y écrire à nouveau quelque chose, n'oubliez pas d'ajouter f.seek(0)après f.truncate(0), sinon vous aurez un \ x00 bizarre ajouté au début du fichier.
krishna chaitanya
29

Pas une réponse complète mais plutôt une extension de la réponse d'Ondra

Lorsque vous utilisez truncate()(ma méthode préférée), assurez-vous que votre curseur est à la position requise. Lorsqu'un nouveau fichier est ouvert en lecture, open('FILE_NAME','r')son curseur est à 0 par défaut. Mais si vous avez analysé le fichier dans votre code, assurez-vous de pointer à nouveau au début du fichier, c'est-à-dire que truncate(0) par défaut truncate()tronque le contenu d'un fichier à partir de la position actuelle du cusror.

Un exemple simple

Snigdha Batra
la source
22

L'ouverture d'un fichier en mode "écriture" l'efface, vous n'avez pas à y écrire spécifiquement:

open("filename", "w").close()

(vous devez le fermer car le moment auquel le fichier se ferme automatiquement peut être spécifique à l'implémentation)

Douglas Leeder
la source
10

De l'utilisateur @jamylak, une forme alternative de open("filename","w").close()is

with open('filename.txt','w'): pass
DécontractéCoder3
la source
8

Lors de l'utilisation with open("myfile.txt", "r+") as my_file:, j'obtiens d'étranges zéros myfile.txt, d'autant plus que je lis le fichier en premier. Pour que cela fonctionne, j'ai d'abord dû changer le pointeur de my_filevers le début du fichier avec my_file.seek(0). Ensuite, je pourrais faire my_file.truncate()pour effacer le fichier.

wcyn
la source
1
Cela ne devrait pas surprendre, cela a été mentionné dans cette réponse 3 ans plus tôt.
AMC le
6

Vous devez écraser le fichier. En C ++:

#include <fstream>

std::ofstream("test.txt", std::ios::out).close();
Alex Korban
la source
1
Il n'y a pas besoin de l' close()appel. Le destructeur fermera le fichier. Il vous suffit donc de créer un temporaire:ofstream("test.txt");
wilhelmtell
Cette question a changé depuis cette réponse. Peut-être supprimer la question étant donné la nouvelle direction de la question?
Seanny123
1

Attribuer le pointeur de fichier à null dans votre programme supprimera simplement cette référence au fichier. Le fichier est toujours là. Je pense que la remove()fonction dans le c stdio.hest ce que vous recherchez là-bas. Pas sûr de Python.

baies
la source
2
BTW, à la fois remove () et unlink () réduiront le nombre de références sur un fichier normal, pas l'effacer réellement. Le fichier sera effacé une fois que le nombre de références tombe à zéro. Par exemple, si votre processus a le fichier ouvert et que vous appelez unlink () ou remove () dessus, il ne sera pas supprimé tant que le fichier ne sera pas close () d (c'est-à-dire que le nombre de ref tombe à zéro - suppose également qu'aucun autre processus ouvrir le fichier). Ce comportement est utile, par exemple, pour garantir que les fichiers temporaires ne sont pas laissés après une interruption anormale du processus (par exemple, open (), unlink (), exécuter un fichier IO, CRASH , close () NON appelé).
Annulé
1

Si la sécurité est importante pour vous, ouvrir le fichier pour l'écrire et le refermer ne suffira pas. Au moins certaines des informations seront toujours sur le périphérique de stockage et pourront être trouvées, par exemple, à l'aide d'un utilitaire de récupération de disque.

Supposons, par exemple, que le fichier que vous effacez contient des mots de passe de production et doit être supprimé immédiatement après la fin de l'opération en cours.

Le remplissage à zéro du fichier une fois que vous avez fini de l'utiliser permet de garantir la destruction des informations sensibles.

Sur un projet récent, nous avons utilisé le code suivant, qui fonctionne bien pour les petits fichiers texte. Il écrase le contenu existant avec des lignes de zéros.

import os

def destroy_password_file(password_filename):
    with open(password_filename) as password_file:
        text = password_file.read()
    lentext = len(text)
    zero_fill_line_length = 40
    zero_fill = ['0' * zero_fill_line_length
                      for _
                      in range(lentext // zero_fill_line_length + 1)]
    zero_fill = os.linesep.join(zero_fill)
    with open(password_filename, 'w') as password_file:
        password_file.write(zero_fill)

Notez que le remplissage nul ne garantira pas votre sécurité. Si vous êtes vraiment inquiet, vous feriez mieux de ne rien remplir et d' utiliser un utilitaire spécialisé comme File Shredder ou CCleaner pour nettoyer l'espace `` vide '' de votre disque.

pseudo
la source
0

Vous ne pouvez pas «effacer» un fichier sur place, sauf si vous devez effacer la fin. Soit vous contenter de remplacer une valeur «vide», soit lire les parties du fichier qui vous intéressent et l'écrire dans un autre fichier.

Ignacio Vazquez-Abrams
la source
ok comment l'écraser sans donner de valeur poubelle? Je veux dire, supposons qu'une longueur de chaîne de 9 soit là et que je l'écrase avec une longueur de chaîne de 6. cela signifierait 3 valeurs de déchets rt?
Hick
Correct. De plus, vous devrez avoir un moyen d'identifier à n'importe quel lecteur le fait que ces 3 caractères sont des ordures.
Ignacio Vazquez-Abrams
le fait est que mon code est réparti entre python et c ++. donc si une lecture de fichier est faite en C ++ et une écriture de fichier en python .. à la fois le temps que le fichier doit être effacé ..
Hick
0

Les fichiers texte étant séquentiels, vous ne pouvez pas effacer directement les données qu'ils contiennent. Vos options sont:

  • La méthode la plus courante consiste à créer un nouveau fichier. Lisez le fichier d'origine et écrivez tout sur le nouveau fichier, sauf la partie que vous souhaitez effacer. Lorsque tout le fichier a été écrit, supprimez l'ancien fichier et renommez le nouveau fichier pour qu'il ait le nom d'origine.
  • Vous pouvez également tronquer et réécrire le fichier entier à partir du point que vous souhaitez modifier. Recherchez le point que vous souhaitez modifier et lisez le reste du fichier en mémoire. Revenez au même point, tronquez le fichier et réécrivez le contenu sans la partie que vous souhaitez effacer.
  • Une autre option simple consiste à remplacer les données par une autre donnée de même longueur. Pour cela, cherchez la position exacte et écrivez les nouvelles données. La limitation est qu'il doit avoir exactement la même longueur.

Regardez la méthode seek/ truncatefunction / pour implémenter l'une des idées ci-dessus. Python et C ont tous deux ces fonctions.

nosklo
la source
je veux juste effacer tout le fichier depuis le début
Hick
2
Ensuite, supprimez simplement le fichier. Utilisez os.removeou os.unlinken python, ou unlinken C. Une autre option consiste simplement à rouvrir le fichier pour l'écriture ou l'utilisation truncate.
nosklo
0

Écriture et lecture du contenu d'un fichier

def writeTempFile(text = ''):
    filePath = "/temp/file1.txt"
    if not text:                      # If blank return file content
        f = open(filePath, "r")
        slug = f.read()
        return slug
    else:
        f = open(filePath, "a") # Create a blank file
        f.seek(0)  # sets  point at the beginning of the file
        f.truncate()  # Clear previous content
        f.write(text) # Write file
        f.close() # Close file
        return text

Cela a fonctionné pour moi

Mohd Tauovir Khan
la source
0

Vous pouvez également utiliser ceci (basé sur quelques-unes des réponses ci-dessus):

file = open('filename.txt', 'w')
file.write('')
file.close

bien sûr, c'est une très mauvaise façon d'effacer un fichier car cela nécessite tellement de lignes de code, mais je viens de l'écrire pour vous montrer que cela peut également être fait dans cette méthode.

bon codage!

sujay simha
la source