¿Qué significa% s en una cadena de formato python?

167

¿Qué %ssignifica en Python? ¿Y qué hace el siguiente fragmento de código?

Por ejemplo...

 if len(sys.argv) < 2:
     sys.exit('Usage: %s database-name' % sys.argv[0])

 if not os.path.exists(sys.argv[1]):
     sys.exit('ERROR: Database %s was not found!' % sys.argv[1])
Tyler
fuente
44
El %operador está en desuso a favor del str.formatmétodo más potente , consulte PEP-3101 .
Paulo Scardine
35
En realidad, ese PEP dice "En Python 3.0, el operador% se complementa con un método de formateo de cadenas más potente" y que se exporta a Python 2.6. De donde vengo "suplementado" significa agregado, no reemplazado. La PEP no dice "suplantado" y en ninguna parte de la PEP dice que el operador% está en desuso (pero sí dice que otras cosas están en desuso en la parte inferior). Es posible que prefiera str.format y eso está bien, pero hasta que haya una PEP que indique que está en desuso, no tiene sentido afirmar que es cuando no lo está.
Ben

Respuestas:

199

Es una sintaxis de formato de cadena (que toma prestada de C).

Por favor vea "PyFormat" :

Python admite el formato de valores en cadenas. Aunque esto puede incluir expresiones muy complicadas, el uso más básico es insertar valores en una cadena con el %smarcador de posición.

Editar: Aquí hay un ejemplo realmente simple:

#Python2
name = raw_input("who are you? ")
print "hello %s" % (name,)

#Python3+
name = input("who are you? ")
print("hello %s" % (name,))

El %stoken me permite insertar (y potencialmente formatear) una cadena. Observe que el %stoken se reemplaza por lo que pase a la cadena después del %símbolo. Observe también que también estoy usando una tupla aquí (cuando solo tiene una cadena usando una tupla es opcional) para ilustrar que se pueden insertar y formatear múltiples cadenas en una sola declaración.

Andrew Hare
fuente
11
Tenga en cuenta que este tipo de interpolación de cadenas está en desuso a favor del str.formatmétodo más potente .
Paulo Scardine
66
En python3, raw_input () ahora es solo input () para aquellos de ustedes que lo están intentando.
Gothburz
1
¿Por qué (name,)y no solo name?
Cameron Hudson
112

La respuesta de Andrew es buena.

Y solo para ayudarlo un poco más, así es como usa el formato múltiple en una cadena

"Hello %s, my name is %s" % ('john', 'mike') # Hello john, my name is mike".

Si está usando ints en lugar de string, use% d en lugar de% s.

"My name is %s and i'm %d" % ('john', 12) #My name is john and i'm 12
sqram
fuente
2
bonito. % d te salva de lanzar str (int). ¿Alguna idea de lo que representan% sy% d? Supongo que los recordaré como una cadena y un dígito.
user391339
1
@ user391339 significa decimal :) todos están aquí docs.python.org/2/library/…
sqram
No lo sé para versiones anteriores, pero al menos para 3.6 funciona igual incluso si lo usas %sen enteros, solo se convertirá en una cadena.
lapin
@lapin tienes razón :). pero eso no siempre es lo que quieres. Digamos que desea rellenar un dígito, por ejemplo. print('This number will be padded with 4 zeros: %05d ' % 1)Esto funcionará. print('This number will be padded with 4 zeros: %05s ' % 1)- esto no `
sqram
28

El formatmétodo se introdujo en Python 2.6. Es más capaz y no mucho más difícil de usar:

>>> "Hello {}, my name is {}".format('john', 'mike')
'Hello john, my name is mike'.

>>> "{1}, {0}".format('world', 'Hello')
'Hello, world'

>>> "{greeting}, {}".format('world', greeting='Hello')
'Hello, world'

>>> '%s' % name
"{'s1': 'hello', 's2': 'sibal'}"
>>> '%s' %name['s1']
'hello'
dansalmo
fuente
11
Esta respuesta mejoraría si explicara que la sintaxis en la pregunta formateaba el texto y luego demostrara el método más nuevo. De esa manera podría sostenerse por sí mismo. Proporcionar un ejemplo que sea equivalente al ejemplo en la pregunta también sería una ventaja.
Steve S
13

%sindica un tipo de conversión de cadena cuando se utilizan las capacidades de formato de cadena de Python. Más específicamente, %sconvierte un valor especificado en una cadena usando la str()función. Compare esto con el %rtipo de conversión que usa la repr()función para la conversión de valor.

Echa un vistazo a los documentos para el formato de cadena .

Brandon E Taylor
fuente
13

%sy %dson especificadores de formato o marcadores de posición para formatear cadenas / decimales / flotantes, etc.

MÁS común usado Especificador de formato:

%s : cuerda

%d : decimales

%f : flotador

Código autoexplicativo:

name = "Gandalf"
extendedName = "the Grey"
age = 84
IQ = 149.9
print('type(name):', type(name)) #type(name): <class 'str'>
print('type(age):', type(age))   #type(age): <class 'int'>   
print('type(IQ):', type(IQ))     #type(IQ): <class 'float'>   

print('%s %s\'s age is %d with incredible IQ of %f ' %(name, extendedName, age, IQ)) #Gandalf the Grey's age is 84 with incredible IQ of 149.900000 

#Same output can be printed in following ways:


print ('{0} {1}\'s age is {2} with incredible IQ of {3} '.format(name, extendedName, age, IQ))          # with help of older method
print ('{} {}\'s age is {} with incredible IQ of {} '.format(name, extendedName, age, IQ))          # with help of older method

print("Multiplication of %d and %f is %f" %(age, IQ, age*IQ)) #Multiplication of 84 and 149.900000 is 12591.600000          

#storing formattings in string

sub1 = "python string!"
sub2 = "an arg"

a = "i am a %s" % sub1
b = "i am a {0}".format(sub1)

c = "with %(kwarg)s!" % {'kwarg':sub2}
d = "with {kwarg}!".format(kwarg=sub2)

print(a)    # "i am a python string!"
print(b)   # "i am a python string!"
print(c)    # "with an arg!"
print(d)   # "with an arg!"
Om Sao
fuente
6

En respuesta a su segunda pregunta: ¿Qué hace este código? ...

Este es un código de comprobación de errores bastante estándar para un script de Python que acepta argumentos de línea de comandos.

Entonces, la primera ifdeclaración se traduce en: si no me ha pasado una discusión, le diré cómo debe pasarme una discusión en el futuro, por ejemplo, verá esto en la pantalla:

Usage: myscript.py database-name

La siguiente ifdeclaración verifica si el 'nombre-base de datos' que le pasó al script realmente existe en el sistema de archivos. Si no, recibirá un mensaje como este:

ERROR: Database database-name was not found!

De la documentación :

argv [0] es el nombre del script (depende del sistema operativo si se trata de un nombre de ruta completo o no). Si el comando se ejecutó utilizando la opción de línea de comando -c para el intérprete, argv [0] se establece en la cadena '-c'. Si no se pasó ningún nombre de script al intérprete de Python, argv [0] es la cadena vacía.

carne_mecánica
fuente
2

Aquí hay un buen ejemplo en Python3.

  >>> a = input("What is your name?")
  What is your name?Peter

  >>> b = input("Where are you from?")
  Where are you from?DE

  >>> print("So you are %s of %s" % (a, b))
  So you are Peter of DE
Gothburz
fuente