Uso di più argomenti per la formattazione delle stringhe in Python (ad es. '% S ...% s')


174

Ho una stringa che assomiglia '%s in %s'e voglio sapere come separare gli argomenti in modo che siano due% s diversi. La mia mente proveniente da Java mi è venuta in mente:

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

Ma questo non funziona, quindi come appare in Python?

Risposte:


191

La risposta di Mark Cidade è giusta: devi fornire una tupla.

Tuttavia da Python 2.6 in poi puoi usare formatinvece di %:

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

L'uso di %per la formattazione delle stringhe non è più incoraggiato.

Questo metodo di formattazione delle stringhe è il nuovo standard in Python 3.0 e dovrebbe essere preferito alla formattazione% descritta in Operazioni di formattazione delle stringhe nel nuovo codice.


5
Inoltre, a partire da Python 2.7, può rilasciare il numero di indice, ovvero utilizzare una '{} in {}'stringa di formato normale .
Cristian Ciupitu,

121

Se stai usando più di un argomento, deve essere in una tupla (nota le parentesi extra):

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

Come sottolinea EOL, la unicode()funzione di solito assume la codifica ASCII come predefinita, quindi se si hanno caratteri non ASCII, è più sicuro passare esplicitamente la codifica:

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

E a partire da Python 3.0, è preferibile utilizzare la str.format()sintassi invece:

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

60

Su un oggetto tupla / mapping per argomento multiplo format

Quanto segue è estratto dalla documentazione:

Dato format % values, le %specifiche di conversione formatsono sostituite con zero o più elementi di values. L'effetto è simile all'utilizzo sprintf()nel linguaggio C.

Se formatrichiede un singolo argomento, i valori possono essere un singolo oggetto non tupla. Altrimenti, valori devono essere una tupla esattamente il numero di elementi specificati dalla formatstringa , o un singolo oggetto di mappatura (ad esempio, un dizionario).

Riferimenti


On str.formatinvece di%

Un'alternativa più recente %all'operatore è l'uso str.format. Ecco un estratto dalla documentazione:

str.format(*args, **kwargs)

Eseguire un'operazione di formattazione delle stringhe. La stringa su cui viene chiamato questo metodo può contenere testo letterale o campi di sostituzione delimitati da parentesi graffe {}. Ciascun campo di sostituzione contiene l'indice numerico di un argomento posizionale o il nome di un argomento di parola chiave. Restituisce una copia della stringa in cui ogni campo di sostituzione viene sostituito con il valore di stringa dell'argomento corrispondente.

Questo metodo è il nuovo standard in Python 3.0 e dovrebbe essere preferito alla %formattazione .

Riferimenti


Esempi

Ecco alcuni esempi di utilizzo:

>>> '%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

Guarda anche


Non ho modo di testarlo (non conosco molto Python), ma gli esempi sembrano suggerire che qualcosa del genere '{self.author} in {self.publication}'.format(self=self)dovrebbe "funzionare". Non sono sicuro di tutto unicode.
poligenelubrificanti

1
Sì, puoi effettivamente accedere agli attributi (e anche agli indici). Vedi docs.python.org/library/string.html#formatstrings Quindi nel tuo esempio avresti potuto usare {first[0]}l'iniziale J.
Duncan,

10

Devi solo mettere i valori tra parentesi:

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

Qui, per la prima %sl' unicode(self.author)sarà posto. E per il secondo %s, unicode(self.publication)verrà utilizzato.

Nota: dovresti favorire string formattingla %notazione. Maggiori informazioni qui


Non riesco a credere che la gente suggerisca ancora %spiuttostoformat
user1767754,

8

C'è un problema significativo con alcune delle risposte pubblicate finora: unicode()decodifica dalla codifica predefinita, che spesso è ASCII; infatti, unicode()cerca di dare un "senso" ai byte che viene dato convertendoli in caratteri. Pertanto, il seguente codice, che è essenzialmente ciò che è raccomandato dalle risposte precedenti, non riesce sulla mia macchina:

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

dà:

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)

L'errore deriva dal fatto che authornon contiene solo byte ASCII (ovvero con valori in [0; 127]) e unicode()decodifica da ASCII per impostazione predefinita (su molte macchine).

Una soluzione affidabile è quella di fornire esplicitamente la codifica utilizzata nei campi; prendendo UTF-8 come esempio:

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

(o senza l'iniziale u, a seconda che si desideri un risultato Unicode o una stringa di byte).

A questo punto, si potrebbe voler considerare di avere i campi authore publicationcome stringhe Unicode, invece di decodificarli durante la formattazione.


5

Per python2 puoi anche farlo

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

che è utile se hai molti argomenti da sostituire (in particolare se stai facendo l'internazionalizzazione)

Supporta Python2.6 in poi .format()

'{author} in {publication}'.format(author=self.author,
                                   publication=self.publication)

4

Puoi anche usarlo pulito e semplice (ma sbagliato! Perché dovresti usare formatcome ha detto Mark Byers) facendo:

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

3

Per completezza, in Python 3.6 sono introdotte f-string in PEP-498 . Queste stringhe lo rendono possibile

incorporare espressioni all'interno di valori letterali stringa, utilizzando una sintassi minima.

Ciò significherebbe che per il tuo esempio potresti anche usare:

f'{self.author} in {self.publication}'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.