web-dev-qa-db-fra.com

Comment faire du traitement de fichier virtuel?

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?

50
Steve Grafton

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.

54
martineau

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
46
Viktor Kerkez

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 

0
Apostolos

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.

0
nickie