Verwenden mehrerer Argumente für die Formatierung von Zeichenfolgen in Python (z. B. '% s…% s')

174

Ich habe eine Zeichenfolge, die aussieht, '%s in %s'und ich möchte wissen, wie die Argumente so getrennt werden, dass sie zwei verschiedene% s sind. Meine Gedanken aus Java kamen auf folgendes:

'%s in %s' % unicode(self.author),  unicode(self.publication)

Aber das funktioniert nicht. Wie sieht es in Python aus?

Dean
quelle

Antworten:

191

Mark Cidades Antwort ist richtig - Sie müssen ein Tupel angeben.

Ab Python 2.6 können Sie jedoch formatanstelle von %:

'{0} in {1}'.format(unicode(self.author,'utf-8'),  unicode(self.publication,'utf-8'))

Die Verwendung %zum Formatieren von Zeichenfolgen wird nicht mehr empfohlen.

Diese Methode zur Formatierung von Zeichenfolgen ist der neue Standard in Python 3.0 und sollte der% Formatierung vorgezogen werden, die unter Zeichenfolgenformatierungsvorgänge in neuem Code beschrieben wird.

Mark Byers
quelle
5
Ebenfalls ab Python 2.7 kann er die Indexnummer löschen, dh eine einfache '{} in {}'Formatzeichenfolge verwenden.
Cristian Ciupitu
121

Wenn Sie mehr als ein Argument verwenden, muss es in einem Tupel stehen (beachten Sie die zusätzlichen Klammern):

'%s in %s' % (unicode(self.author),  unicode(self.publication))

Wie EOL hervorhebt, geht die unicode()Funktion normalerweise von einer ASCII-Codierung als Standard aus. Wenn Sie also Nicht-ASCII-Zeichen haben, ist es sicherer, die Codierung explizit zu übergeben:

'%s in %s' % (unicode(self.author,'utf-8'),  unicode(self.publication('utf-8')))

Ab Python 3.0 wird str.format()stattdessen lieber die Syntax verwendet:

'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))
Mark Cidade
quelle
60

Auf einem Tupel / Mapping-Objekt für mehrere Argumente format

Folgendes ist ein Auszug aus der Dokumentation:

Gegeben format % values, %Konvertierungsspezifikationen in formatwerden durch null oder mehr Elemente von ersetzt values. Der Effekt ist ähnlich wie bei der Verwendungsprintf() in der Sprache C.

Wenn formatein einzelnes Argument erforderlich ist, können Werte ein einzelnes Nicht-Tupel-Objekt sein. Andernfalls müssen Werte ein Tupel sein mit genau der Anzahl der Elemente von der angegebenen formatZeichenfolge , oder ein einzelnes Mapping - Objekt (zum Beispiel ein Wörterbuch).

Verweise


Ein str.formatstatt%

Eine neuere Alternative zum %Bediener ist die Verwendung str.format. Hier ist ein Auszug aus der Dokumentation:

str.format(*args, **kwargs)

Führen Sie eine Zeichenfolgenformatierung durch. Die Zeichenfolge, für die diese Methode aufgerufen wird, kann Literaltext oder Ersetzungsfelder enthalten, die durch geschweifte Klammern getrennt sind{} . Jedes Ersetzungsfeld enthält entweder den numerischen Index eines Positionsarguments oder den Namen eines Schlüsselwortarguments. Gibt eine Kopie der Zeichenfolge zurück, bei der jedes Ersetzungsfeld durch den Zeichenfolgenwert des entsprechenden Arguments ersetzt wird.

Diese Methode ist der neue Standard in Python 3.0 und sollte der %Formatierung vorgezogen werden .

Verweise


Beispiele

Hier einige Anwendungsbeispiele:

>>> '%s for %s' % ("tit", "tat")
tit for tat

>>> '{} and {}'.format("chicken", "waffles")
chicken and waffles

>>> '%(last)s, %(first)s %(last)s' % {'first': "James", 'last': "Bond"}
Bond, James Bond

>>> '{last}, {first} {last}'.format(first="James", last="Bond")
Bond, James Bond

Siehe auch

Polygenschmierstoffe
quelle
Ich habe keine Möglichkeit, dies zu testen (ich kenne Python nicht so gut), aber die Beispiele scheinen darauf hinzudeuten, dass so etwas '{self.author} in {self.publication}'.format(self=self)"funktionieren" sollte. Ich bin mir einfach nicht sicher unicode.
Polygenelubricants
1
Ja, Sie können tatsächlich auf Attribute (und auch auf Indizes) zugreifen. Siehe docs.python.org/library/string.html#formatstrings. In Ihrem Beispiel hätten Sie also {first[0]}die Initiale abrufen könnenJ .
Duncan
10

Sie müssen nur die Werte in Klammern setzen:

'%s in %s' % (unicode(self.author),  unicode(self.publication))

Hier wird zum ersten %sdas unicode(self.author)platziert. Und zum zweiten %s, die unicode(self.publication)verwendet werden.

Hinweis: Sie sollten string formattingdie %Notation bevorzugen . Mehr Infos hier

Bahadir Tasdemir
quelle
Ich kann nicht glauben, dass die Leute %sdann eher noch vorschlagenformat
user1767754
8

Bei einigen der bisher veröffentlichten Antworten gibt es ein erhebliches Problem: unicode()Dekodiert von der Standardkodierung, bei der es sich häufig um ASCII handelt. Tatsächlich wird unicode()versucht, die angegebenen Bytes "sinnvoll" zu machen, indem sie in Zeichen umgewandelt werden. Daher schlägt der folgende Code, der im Wesentlichen von früheren Antworten empfohlen wird, auf meinem Computer fehl:

# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))

gibt:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

Der Fehler ist darauf zurückzuführen, dass authornicht nur ASCII-Bytes (dh Werte in [0; 127]) enthalten sind und unicode()standardmäßig (auf vielen Computern) aus ASCII dekodiert werden.

Eine robuste Lösung besteht darin, die in Ihren Feldern verwendete Codierung explizit anzugeben. am Beispiel von UTF-8:

u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))

(oder ohne Initiale u, je nachdem, ob Sie ein Unicode-Ergebnis oder eine Byte-Zeichenfolge wünschen).

An diesem Punkt könnte man das in Betracht ziehen mit authorund publicationFelder werden , um Strings Unicode, anstatt sie Decodierung während der Formatierung.

Eric O Lebigot
quelle
5

Für Python2 können Sie dies auch tun

'%(author)s in %(publication)s'%{'author':unicode(self.author),
                                  'publication':unicode(self.publication)}

Das ist praktisch, wenn Sie viele Argumente zu ersetzen haben (insbesondere, wenn Sie Internationalisierung betreiben).

Python2.6 ab unterstützt .format()

'{author} in {publication}'.format(author=self.author,
                                   publication=self.publication)
John La Rooy
quelle
4

Sie können es auch sauber und einfach verwenden (aber falsch! Weil Sie es verwenden sollten, formatwie Mark Byers sagte), indem Sie Folgendes tun:

print 'This is my %s formatted with %d arguments' % ('string', 2)
Lordn__n
quelle
3

Der Vollständigkeit halber werden in Python 3.6 F-Strings in PEP-498 eingeführt . Diese Saiten machen es möglich

Betten Sie Ausdrücke mit einer minimalen Syntax in Zeichenfolgenliterale ein.

Das würde bedeuten, dass Sie für Ihr Beispiel auch Folgendes verwenden könnten:

f'{self.author} in {self.publication}'
westr
quelle