À quoi sert en réalité StringIO en python?

Je ne suis pas un pro et je me suis gratté la tête pour comprendre à quoi sert exactement StringIO. J'ai été à la recherche autour de l'internet pour quelques exemples. Cependant, presque tous les exemples sont très abstrait. Et ils montrent juste "comment" l'utiliser. Mais aucun d'entre eux montrent le "pourquoi" et "les circonstances dans lesquelles" on devrait l'utiliser? Merci d'avance

p. S. à ne pas confondre avec cette question sur stackoverflow: StringIO Usage qui compare string et StringIo.

60
demandé sur Brian Burns 2011-11-03 18:22:45

7 réponses

il est utilisé lorsque vous avez une API qui ne prend que des fichiers, mais vous devez utiliser une chaîne de caractères. Par exemple, pour compresser une chaîne de caractères en utilisant le module gzip en Python 2:

import gzip
import StringIO

stringio = StringIO.StringIO()
gzip_file = gzip.GzipFile(fileobj=stringio, mode='w')
gzip_file.write('Hello World')
gzip_file.close()

stringio.getvalue()
77
répondu Petr Viktorin 2016-01-08 15:31:19

StringIO vous donne accès à des chaînes de caractères comme des fichiers, vous pouvez donc utiliser un module existant qui traite d'un fichier et ne change presque rien et le fait fonctionner avec des chaînes de caractères.

par exemple, dites que vous avez un logger qui écrit des choses dans un fichier et que vous voulez plutôt envoyer la sortie du log sur le réseau. Vous pouvez lire le fichier et écrire son contenu sur le réseau, ou vous pouvez écrire le log à un objet StringIO et l'expédier à sa destination réseau sans toucher le système de fichiers. StringIO le rend facile à faire la première voie puis passer à la seconde.

28
répondu nmichaels 2011-11-03 14:26:43

dans les cas où vous voulez un objet ressemblant à un fichier qui agit comme un fichier, mais qui écrit dans un tampon de chaîne de caractères en mémoire: StringIO est l'outil. Si vous construisez de grandes chaînes de caractères, comme des documents en texte clair, et que vous faites beaucoup de concaténation de chaînes de caractères, vous pourriez trouver plus facile d'utiliser StringIO au lieu d'un tas d'opérations de type mystr += 'more stuff\n' .

15
répondu jathanism 2011-11-03 14:33:59

deux choses pour lesquelles je l'ai personnellement utilisé:

  1. Ensemble-mise en cache des fichiers. J'ai un script qui lit les fichiers PDF et fait la validation de diverses choses à leur sujet. La bibliothèque PDF que j'utilise prend un fichier ouvert dans son constructeur de document. À l'origine, je venais juste d'ouvrir le PDF que j'étais intéressé à lire, mais quand je l'ai changé pour lire le dossier entier à la fois dans la mémoire puis passer un objet StringIO à la bibliothèque PDF, le temps de fonctionnement de mon script a été coupé en deux.

  2. impression différée. Le même script imprime un en-tête avant chaque PDF qu'il lit. Cependant, je peux spécifier sur la ligne de commande si je dois ignorer certains tests qui sont dans son fichier de configuration, ou n'en inclure que certains. Si j'ignore tous les tests pour un PDF donné, Je ne veux pas que l'en-tête soit imprimé, mais je ne saurai pas combien de tests j'ai effectués jusqu'à ce que j'ai fini d'exécuter les tests (les tests peuvent être définis dynamique). Donc je capture l'en-tête dans un objet StringIO en changeant sys.stdout pour le pointer vers lui, et chaque fois que je lance un test je vérifie pour voir si cet objet a quelque chose dedans. Si c'est le cas, je l'imprime alors et je la réinitialise pour la vider. Voilà, seuls les fichiers qui ont des tests ont des en-têtes imprimés.

8
répondu kindall 2011-11-03 16:25:40

je viens d'utiliser StringIO dans la pratique pour deux choses:

  • à l'unité-tester un script qui fait beaucoup de print ing, en redirigeant sys.stdout à une StringIO instance pour une analyse facile;
  • pour créer un document XML bien formé et garanti (une requête API personnalisée) en utilisant ElementTree puis write pour l'envoyer via une connexion HTTP.

Pas que vous avez besoin de StringIO souvent , mais parfois c'est assez utile.

8
répondu 9000 2011-11-03 23:09:56

Django a une fonction call_command qui est utilisée pour appeler des commandes de gestion. Cette fonction affiche la sortie à stdout et ne renvoie aucune valeur. Si vous voulez savoir si la commande a fonctionné correctement ou non, vous devez regarder en sortie et décider.

en utilisant StringIO, vous pouvez capturer la sortie et vérifier si elle est désirée ou non.

with io.StringIO() as output:
    call_command('custom_command', stdout=output)
    if 'Success' not in output.getvalue():
        print('Custom command failed...')
0
répondu ChillarAnand 2017-01-10 03:48:29

Je l'ai utilisé à la place des fichiers texte pour les tests unitaires.

par exemple, pour faire un 'fichier' csv pour tester avec pandas (Python 3):

import io
f = io.StringIO("id,name\n1,brian\n2,amanda\n3,zoey\n")
df = pd.read_csv(f) # pandas takes a file path or a file-like object

de la documentation ici :

un flux en mémoire pour le texte I/O. Le Tampon de texte est écarté lorsque la méthode close() est appelée.

la valeur initiale du tampon peut être définie en fournissant initial_value.

method getvalue (): renvoie une str contenant tout le contenu du tampon.

0
répondu Brian Burns 2018-05-25 12:32:34