web-dev-qa-db-de.com

Wofür wird StringIO in Python in Wirklichkeit verwendet?

Ich bin kein Profi und habe mir den Kopf gekratzt, um zu verstehen, wofür genau StringIO verwendet wird. Ich habe mich im Internet nach einigen Beispielen umgesehen. Fast alle Beispiele sind jedoch sehr abstrakt. Und sie zeigen nur, wie man es benutzt. Aber keiner von ihnen zeigt "warum" und "unter welchen Umständen" sollte/soll man es verwenden? Vielen Dank im Voraus

p.s. Nicht zu verwechseln mit dieser Frage in stackoverflow: StringIO Usage die String und StringIo vergleicht.

61
Hossein

Es wird verwendet, wenn Sie über eine API verfügen, die nur Dateien verwendet, aber Sie müssen eine Zeichenfolge verwenden. So komprimieren Sie einen String mit dem Modul gzip in 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
Petr Viktorin

StringIO gibt Ihnen dateiähnlichen Zugriff auf Strings, sodass Sie ein vorhandenes Modul verwenden können, das sich mit einer Datei befasst, fast nichts ändert und mit Strings arbeiten kann.

Angenommen, Sie haben einen Logger, der die Daten in eine Datei schreibt und stattdessen die Protokollausgabe über das Netzwerk senden soll. Sie können die Datei lesen und ihren Inhalt in das Netzwerk schreiben, oder Sie können das Protokoll in ein StringIO-Objekt schreiben und an das Netzwerkziel senden, ohne das Dateisystem zu berühren. StringIO macht es einfach, den ersten Weg zu tun und dann auf den zweiten Weg zu wechseln.

28
nmichaels

In den Fällen, in denen Sie ein dateiähnliches Objekt möchten, das ACTS wie eine Datei schreibt, jedoch in einen In-Memory-Stringpuffer schreibt: StringIO ist das Werkzeug. Wenn Sie große Zeichenfolgen erstellen (z. B. Nur-Text-Dokumente) und eine Menge Verkettung von Zeichenfolgen durchführen, ist es möglicherweise einfacher, StringIO anstelle einer Reihe von mystr += 'more stuff\n'-Vorgängen zu verwenden.

15
jathanism

Ich habe StringIO in der Praxis gerade für zwei Dinge verwendet:

  • Um ein Skript zu testen, das viel printing durchführt, indem Sie sys.stdout zur einfachen Analyse an eine StringIO-Instanz umleiten;
  • So erstellen Sie ein garantiertes, wohlgeformtes XML-Dokument (eine benutzerdefinierte API-Anforderung) mit ElementTree und dann write zum Senden über eine HTTP-Verbindung.

Nicht dass Sie StringIOoft brauchen, aber manchmal ist es ziemlich nützlich.

9
9000

Einige Dinge, für die ich es persönlich verwendet habe:

  1. Caching ganzer Dateien Ich habe ein Skript, das PDFs liest und verschiedene Dinge über sie prüft. Die von mir verwendete PDF -Bibliothek nimmt eine geöffnete Datei in ihren Dokumentkonstruktor. Ursprünglich hatte ich gerade erst das PDF geöffnet, an dem ich lesen wollte. Als ich jedoch die gesamte Datei auf einmal in den Speicher eingelesen hatte, übergab ich ein StringIO-Objekt an die PDF -Bibliothek, die Laufzeit meines Skripts wurde in zwei Hälften geschnitten.

  2. Verzögertes Drucken. Das gleiche Skript druckt vor jedem PDF, den es liest, eine Kopfzeile. Ich kann jedoch in der Befehlszeile angeben, ob bestimmte Tests in der Konfigurationsdatei ignoriert oder nur bestimmte Tests eingeschlossen werden sollen. Wenn ich all tests für ein gegebenes PDF ignoriere, möchte ich nicht, dass die Kopfzeile gedruckt wird. Ich weiß jedoch nicht, wie viele Tests ich ausgeführt habe, bis ich die Tests abgeschlossen habe (die Tests können sein.) auch dynamisch definiert). Daher fange ich den Header in einem StringIO-Objekt auf, indem ich sys.stdout so verändere, dass er darauf verweist. Jedes Mal, wenn ich einen Test durchführe, überprüfe ich, ob das Objekt etwas enthält. Wenn ja, drucke ich es und setze es auf leer. Voila, nur für PDFs, die Tests enthalten, werden Kopfzeilen gedruckt.

8
kindall

Ich habe es anstelle von Textdateien für Komponententests verwendet. 

So erstellen Sie eine CSV-Datei zum Testen mit 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

Aus der Dokumentation hier :

Ein In-Memory-Stream für Text-E/A. Der Textpuffer wird beim Aufruf der close () -Methode verworfen.

Der Anfangswert des Puffers kann durch Angabe von Anfangswert festgelegt werden.

method getvalue (): Gibt einen str zurück, der den gesamten Inhalt des Puffers enthält. 

0
Brian Burns

Django hat eine Funktion call_command, mit der Verwaltungsbefehle aufgerufen werden. Diese Funktion druckt die Ausgabe in stdout und gibt keinen Wert zurück. Wenn Sie wissen möchten, ob der Befehl erfolgreich ausgeführt wurde oder nicht, müssen Sie sich die Ausgabe ansehen und entscheiden.

Mit StringIO können Sie die Ausgabe erfassen und prüfen, ob es sich um eine gewünschte Ausgabe handelt oder nicht.

with io.StringIO() as output:
    call_command('custom_command', stdout=output)
    if 'Success' not in output.getvalue():
        print('Custom command failed...')
0
ChillarAnand