Ich möchte einen Zeichenfolgenpuffer erstellen, um viel zu verarbeiten, zu formatieren und schließlich den Puffer in eine Textdatei zu schreiben, wobei eine C-ähnliche sprintf
Funktionalität in Python verwendet wird. Aufgrund von bedingten Anweisungen kann ich sie nicht direkt in die Datei schreiben.
zB Pseudocode:
sprintf(buf,"A = %d\n , B= %s\n",A,B)
/* some processing */
sprint(buf,"C=%d\n",c)
....
...
fprintf(file,buf)
In der Ausgabedatei haben wir also diese Art von O / P:
A= foo B= bar
C= ded
etc...
Bearbeiten, um meine Frage zu klären:
buf
Ist ein großer Puffer enthält alle diese Zeichenfolgen, die mit sprintf formatiert wurden. Wenn Sie sich Ihre Beispiele ansehen, buf
werden nur aktuelle Werte enthalten, keine älteren. zB wurde zuerst in, das buf
ich A= something ,B= something
später schrieb, C= something
dasselbe angehängt buf
, aber in Ihren Python-Antworten buf
ist nur der letzte Wert enthalten, den ich nicht möchte - ich möchte buf
alle printf
s haben, die ich von Anfang an getan habe, wie in C
.
buf
und nicht am Ende.) Es ist wahrscheinlich am besten, ein Array von Zeichenfolgen zu verwenden und sie dann zusammenzufügen, bevor Sie in die Datei schreiben.def sprintf(buf, fmt, *args): ...
Antworten:
Python hat dafür einen
%
Operator.In dieser Referenz finden Sie alle unterstützten Formatspezifizierer.
Sie könnten auch verwenden
format
:quelle
Wenn ich Ihre Frage richtig verstehe, ist format () genau das, wonach Sie suchen, zusammen mit seiner Minisprache .
Dummes Beispiel für Python 2.7 und höher:
Für frühere Python-Versionen: (getestet mit 2.6.2)
quelle
"{0} ...\r\n {1}!".format("Hello", "world")
Ich bin nicht ganz sicher, ob ich Ihr Ziel verstehe, aber Sie können eine
StringIO
Instanz als Puffer verwenden:Im Gegensatz dazu übergeben
sprintf
Sie einfach eine Zeichenfolge anbuf.write
und formatieren sie mit dem%
Operator oder derformat
Methode der Zeichenfolgen.Sie können natürlich eine Funktion definieren, um die
sprintf
gewünschte Schnittstelle zu erhalten :welches so verwendet werden würde:
quelle
io.StringIO()
stattdessen verwendenVerwenden Sie den Formatierungsoperator
%
:quelle
Sie können die Zeichenfolgenformatierung verwenden:
Dies wird jedoch in Python 3 entfernt. Sie sollten "str.format ()" verwenden:
quelle
format()
möglicherweise vorzuziehen, die%
Formatierung ist jedoch weiterhin vorhanden. (Siehe mail.python.org/pipermail/python-dev/2009-September/092399.html für einige der Gründe, warum es nicht veraltet war)Zum Einfügen in eine sehr lange Zeichenfolge ist es hilfreich, Namen für die verschiedenen Argumente zu verwenden, anstatt zu hoffen, dass sie sich an den richtigen Positionen befinden. Dies erleichtert auch das Ersetzen mehrerer Wiederholungen.
Entnommen aus Formatbeispielen , in denen auch alle anderen
Format
Antworten angezeigt werden.quelle
Dies ist wahrscheinlich die nächste Übersetzung von Ihrem C-Code in Python-Code.
Der
%
Operator in Python macht fast genau das Gleiche wie Cssprintf
. Sie können die Zeichenfolge auch direkt in eine Datei drucken. Wenn viele dieser String-formatierten Stringlets beteiligt sind, ist es möglicherweise ratsam, a zu verwendenStringIO
Objekt zu verwenden, um die Verarbeitungszeit zu verkürzen.Anstatt dies zu tun
+=
, tun Sie Folgendes:quelle
Wenn Sie etwas wie die Python3-Druckfunktion wollen, aber eine Zeichenfolge:
oder ohne das
'\n'
am Ende:quelle
Etwas wie...
quelle
Schauen Sie sich "Literal String Interpolation" an https://www.python.org/dev/peps/pep-0498/
Ich fand es über die http://www.malemburg.com/
quelle
Zwei Ansätze bestehen darin, in einen Zeichenfolgenpuffer zu schreiben oder Zeilen in eine Liste zu schreiben und sie später zu verbinden. Ich denke, der
StringIO
Ansatz ist eher pythonisch, hat aber vor Python 2.6 nicht funktioniert.Sie können diese auch ohne
ContextMananger
(s = StringIO()
) verwenden. Derzeit verwende ich eine Kontextmanagerklasse mit einerprint
Funktion. Dieses Fragment kann nützlich sein, um Debugging- oder ungerade Paging-Anforderungen einfügen zu können:quelle