web-dev-qa-db-fra.com

Comment supprimer uniquement le contenu du fichier dans python

J'ai un fichier temporaire avec du contenu et un script python) qui génère une sortie vers ce fichier. Je veux que cela se répète N fois. Je dois donc réutiliser ce fichier (en réalité un tableau de fichiers). Je supprime tout le contenu, donc le fichier temporaire sera vide lors du prochain cycle. Pour supprimer le contenu, j'utilise ce code:

def deleteContent(pfile):

    pfile.seek(0)
    pfile.truncate()
    pfile.seek(0) # I believe this seek is redundant

    return pfile

tempFile=deleteContent(tempFile)

Ma question est la suivante: existe-t-il un autre moyen (meilleur, plus court ou plus sûr) de supprimer tout le contenu sans supprimer réellement le fichier temporaire du disque?

Quelque chose comme tempFile.truncateAll()?

34
bartimar

Comment supprimer uniquement le contenu du fichier en python

Il existe plusieurs façons de définir la taille logique d'un fichier sur 0, en fonction de la méthode utilisée pour accéder à ce fichier:

Pour vider un fichier ouvert:

def deleteContent(pfile):
    pfile.seek(0)
    pfile.truncate()

Pour vider un fichier ouvert dont le descripteur de fichier est connu:

def deleteContent(fd):
    os.ftruncate(fd, 0)
    os.lseek(fd, 0, os.SEEK_SET)

Pour vider un fichier fermé (dont le nom est connu)

def deleteContent(fName):
    with open(fName, "w"):
        pass


J'ai un fichier temporaire avec du contenu [...] il me faut réutiliser ce fichier

Cela étant dit, dans le cas général ce n'est probablement ni efficace ni souhaitable de réutiliser un fichier temporaire. Sauf si vous avez des besoins très spécifiques, vous devriez penser à utiliser tempfile.TemporaryFile et a gestionnaire de contexte pour créer/utiliser/supprimer de manière presque transparente vos fichiers temporaires:

import tempfile

with tempfile.TemporaryFile() as temp:
     # do whatever you want with `temp`

# <- `tempfile` guarantees the file being both closed *and* deleted
#     on exit of the context manager
72
Sylvain Leroux

Je pense que le plus simple est d'ouvrir simplement le fichier en mode écriture puis de le fermer. Par exemple, si votre fichier myfile.dat contient:

"This is the original content"

Ensuite, vous pouvez simplement écrire:

f = open('myfile.dat', 'w')
f.close()

Cela effacerait tout le contenu. Ensuite, vous pouvez écrire le nouveau contenu dans le fichier:

f = open('myfile.dat', 'w')
f.write('This is the new content!')
f.close()
5
Peaceful

Tu peux le faire:

def deleteContent(pfile):
    fn=pfile.name 
    pfile.close()
    return open(fn,'w')
2
the wolf

Quoi de plus facile que quelque chose comme ça:

import tempfile

for i in range(400):
    with tempfile.TemporaryFile() as tf:
        for j in range(1000):
            tf.write('Line {} of file {}'.format(j,i))

Cela crée 400 fichiers temporaires et écrit 1 000 lignes dans chaque fichier temporaire. Il s'exécute en moins de 1/2 seconde sur ma machine banale. Chaque fichier temporaire du total est créé et supprimé lorsque le gestionnaire de contexte s'ouvre et se ferme dans ce cas. C'est rapide, sécurisé et multi-plateforme.

Utiliser tempfile est beaucoup mieux que d’essayer de le réinventer.

2
dawg