90 votes

Comment faire du traitement de fichiers virtuels ?

Pour créer des fichiers, j'utilise donc ce qui suit :

fileHandle = open('fileName', 'w')

puis écrire le contenu dans le fichier, fermer le fichier. Dans l'étape suivante, je traite le fichier. À la fin du programme, je me retrouve avec un "fichier physique" que je dois supprimer.

Existe-t-il un moyen d'écrire un fichier "virtuel" qui se comporte exactement comme un fichier "physique" (permettant de le manipuler de la même manière) mais qui n'existe pas à la fin de l'exécution en Python ?

82voto

martineau Points 21665

Vous pouvez envisager d'utiliser un tempfile.SpooledTemporaryFile qui vous offre le meilleur des deux mondes en ce sens qu'il crée initialement un fichier virtuel temporaire basé sur la mémoire, mais passe automatiquement à un fichier physique basé sur le disque si les données conservées en mémoire dépassent une taille donnée.

Une autre caractéristique intéressante est que (lors de l'utilisation de la mémoire), il utilisera automatiquement soit une carte à puce soit une carte à puce. io.BytesIO ou io.StringIO en fonction de ce que mode est utilisé, ce qui vous permet de lire et d'écrire des chaînes Unicode ou des données binaires (octets).

La seule difficulté réside dans le fait que vous devez éviter de fermer le fichier entre les étapes, car cela entraînerait sa suppression de la mémoire ou du disque. Au lieu de cela, vous pouvez simplement revenir au début avec un fichier seek(0) l'appel de la méthode.

Lorsque vous avez terminé le fichier et que vous le fermez, il est automatiquement supprimé du disque si la quantité de données qu'il contient a entraîné son transfert vers un fichier physique.

56voto

Viktor Kerkez Points 11222

Vous avez StringIO y BytesIO dans le io module.

StringIO se comporte comme un fichier ouvert en mode texte - lecture et écriture de chaînes unicode (équivalent à l'ouverture d'un fichier avec io.open(filename, mode, encoding='...') ), et le BytesIO se comporte comme un fichier ouvert en mode binaire ( mode='[rw]b' ), et peut lire et écrire des octets.

Python 2 :

In [4]: f = io.BytesIO('test')
In [5]: type(f.read())
Out[5]: str
In [6]: f = io.StringIO(u'test')
In [7]: type(f.read())
Out[7]: unicode

Python 3 :

In [2]: f = io.BytesIO(b'test')
In [3]: type(f.read())
Out[3]: builtins.bytes
In [4]: f = io.StringIO('test')
In [5]: type(f.read())
Out[5]: builtins.str

13voto

Vous pouvez utiliser StringIO comme un fichier virtuel , de l'officiel documentation

from io import StringIO

output = StringIO()
output.write('First line.\n')
print >>output, 'Second line.'

# Retrieve file contents -- this will be
# 'First line.\nSecond line.\n'
contents = output.getvalue()

# Close object and discard memory buffer --
# .getvalue() will now raise an exception.
output.close()

0voto

nickie Points 3226

Il y a le StringIO module, lire sa documentation il doit être facile à utiliser.

Gardez à l'esprit, cependant, que cela conserverait le contenu du "fichier" en mémoire. Si vous avez trop de données, il serait probablement mieux de créer un vrai fichier, par exemple dans /tmp, et de le supprimer ensuite.

0voto

Apostolos Points 847

Si vous voulez écrire en mémoire plutôt que dans un fichier, vous pouvez simplement écrire le texte dans un tampon et utiliser la fonction suivante :

def write(text):
  global buffer
  buffer += text + '\n'  # Add a linefeed as you would if you were writing to a file

buffer = ""  # Initialize the buffer
write("My name is Steve Grafton")

À la fin, vous aurez un tampon qui sera le même que si vous aviez écrit vos trucs dans un fichier, puis ouvert le fichier et lu tout son contenu dans un tampon ! De plus, vous pouvez utiliser le tampon pendant le processus (avant d'avoir fini d'écrire) et y faire des recherches, comme si vous aviez créé un fichier pour la lecture et l'écriture, sauf que dans ce cas votre pointeur sera

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X