Comment puis-je conserver sur un disque un fichier temporaire en utilisant Python?

StackOverflow https://stackoverflow.com/questions/94153

  •  01-07-2019
  •  | 
  •  

Question

J'essaie d'utiliser le module 'tempfile' pour manipuler et créer des fichiers texte. Une fois que le fichier est prêt, je veux le sauvegarder sur le disque. Je pensais que ce serait aussi simple que d'utiliser 'shutil.copy'. Cependant, j'obtiens une 'autorisation refusée'. IOError:

>>> import tempfile, shutil
>>> f = tempfile.TemporaryFile(mode ='w+t')
>>> f.write('foo')
>>> shutil.copy(f.name, 'bar.txt')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    shutil.copy(f.name, 'bar.txt')
  File "C:\Python25\lib\shutil.py", line 80, in copy
    copyfile(src, dst)
  File "C:\Python25\lib\shutil.py", line 46, in copyfile
    fsrc = open(src, 'rb')
IOError: [Errno 13] Permission denied: 'c:\\docume~1\\me\\locals~1\\temp\\tmpvqq3go'
>>> 

N’at-il pas été prévu d’utiliser la bibliothèque 'tempfile'? Y a-t-il une meilleure manière de faire cela? (Peut-être que je néglige quelque chose de très trivial)

Était-ce utile?

La solution

Le fichier que vous créez avec TemporaryFile ou NamedTemporaryFile est automatiquement supprimé à sa fermeture. C'est pourquoi vous obtenez une erreur. Si vous ne le souhaitez pas, vous pouvez utiliser mkstemp à la place (voir la documentation de fichier_fichier ).

>>> import tempfile, shutil, os
>>> fd, path = tempfile.mkstemp()
>>> os.write(fd, 'foo')
>>> os.close(fd)
>>> shutil.copy(path, 'bar.txt')
>>> os.remove(path)

Autres conseils

hop a raison, et dF. est incorrect sur la raison pour laquelle l'erreur se produit.

Puisque vous n'avez pas encore appelé f.close () , le fichier n'est pas supprimé.

Le doc pour NamedTemporaryFile :

  

Si le nom peut être utilisé pour ouvrir le fichier une seconde fois, alors que le fichier temporaire nommé est toujours ouvert, cela varie selon les plates-formes (il peut être utilisé de la sorte sous Unix; il ne peut pas l'être sous Windows NT ou ultérieur).

Et pour TemporaryFile :

  

Sous Unix, l’entrée du répertoire du fichier est supprimée immédiatement après sa création. Les autres plates-formes ne supportent pas cela; votre code ne doit pas dépendre d'un fichier temporaire créé à l'aide de cette fonction ayant ou non un nom visible dans le système de fichiers.

Par conséquent, pour conserver un fichier temporaire (sous Windows), procédez comme suit:

import tempfile, shutil
f = tempfile.NamedTemporaryFile(mode='w+t', delete=False)
f.write('foo')
file_name = f.name
f.close()
shutil.copy(file_name, 'bar.txt')
os.remove(file_name)

La solution fournie par Hans Sjunnesson est également désactivée, car copyfileobj ne copie que des objets de type fichier vers des objets de type fichier, pas le nom de fichier:

  

shutil.copyfileobj (fsrc, fdst [, longueur])

     
    

Copiez le contenu de l'objet de type fichier fsrc dans l'objet de type fichier fdst. La longueur entière, si elle est donnée, est la taille de la mémoire tampon. En particulier, une valeur de longueur négative signifie copier les données sans effectuer de boucle sur les données source en morceaux; Par défaut, les données sont lues en morceaux pour éviter une consommation de mémoire incontrôlée. Notez que si la position actuelle du fichier de l'objet fsrc n'est pas 0, seul le contenu de la position actuelle du fichier jusqu'à la fin du fichier sera copié.

  

À partir de python 2.6, vous pouvez également utiliser NamedTemporaryFile avec l'option delete = définie sur False. Ainsi, le fichier temporaire sera accessible même après l'avoir fermé.

Notez que sous Windows (NT et versions ultérieures), vous ne pouvez pas accéder au fichier une seconde fois tant qu'il est toujours ouvert. Vous devez le fermer avant de pouvoir le copier. Ce n'est pas vrai sur les systèmes Unix.

Vous pouvez toujours utiliser shutil.copyfileobj , dans votre exemple:

new_file = open('bar.txt', 'rw')
shutil.copyfileobj(f, new_file)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top