Donc, pour créer des fichiers, j'utilise ce qui suit:
fileHandle = open('fileName', 'w')
puis écrivez le contenu dans le fichier, fermez le fichier . À 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" (lui permettant d'être manipulé de la même manière) mais n'existant pas à la fin de l'exécution en Python?
Vous voudrez peut-être envisager d’utiliser un tempfile.SpooledTemporaryFile
qui vous donne le meilleur des deux mondes en ce sens qu’il créera initialement un fichier virtuel temporaire basé sur la mémoire, mais basculera automatiquement vers un fichier physique basé sur un disque si les données stockées sont stockées. en mémoire dépasse une taille spécifiée.
Une autre caractéristique intéressante est que (en utilisant la mémoire), il utilisera automatiquement un io.BytesIO
ou io.StringIO
selon la nature de la variable mode
- vous permettant de lire et d’écrire des chaînes Unicode ou des données binaires (octets). à cela.
La seule difficulté réside peut-être dans le fait que vous ne devez pas fermer le fichier entre les étapes car vous risqueriez de le supprimer de la mémoire ou du disque. Au lieu de cela, vous pouvez simplement revenir au début avec un appel de fichier seek(0)
method.
Lorsque vous avez terminé et que vous fermez le fichier, celui-ci est automatiquement supprimé du disque si la quantité de données qu'il contient a été transféré dans un fichier physique.
Vous avez StringIO
et BytesIO
dans le module io
.
StringIO
se comporte comme un fichier ouvert en mode texte - lire et écrire des chaînes unicode (équivalent à ouvrir un fichier avec io.open(filename, mode, encoding='...')
), et la BytesIO
se comporte comme un fichier ouvert en mode binaire (mode='[rw]b'
) et peut lire les octets en écriture.
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
Vous pouvez utiliser StringIO en tant que fichier virtuel, À partir de documentation officielle
import StringIO
output = StringIO.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()
Si vous voulez dire écrire dans la 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")
A la fin, vous aurez un tampon qui sera le même que si vous aviez écrit votre contenu dans un fichier, puis ouvrez le fichier et lisez tout son contenu dans un tampon! De plus, vous pouvez utiliser le tampon pendant la processus (avant d’avoir terminé votre écriture) et y faire des recherches, comme si vous aviez créé un fichier pour la lecture et l’écriture, seulement que dans ce cas votre pointeur
Il y a le module StringIO
, lisez sa documentation , il devrait être facile à utiliser.
Gardez toutefois à l'esprit que cela garderait le contenu du "fichier" en mémoire. Si vous avez trop de données, il serait probablement préférable de créer un fichier réel, par exemple. dans/tmp et supprimez-le ensuite.