¿Cómo pongo el valor de una variable dentro de una cadena (interpolarlo en la cadena)?

4 minutos de lectura

Avatar de usuario de Gish
Gish

me gustaria poner un int en un string. Esto es lo que estoy haciendo en este momento:

num = 40
plot.savefig('hanning40.pdf') #problem line

Tengo que ejecutar el programa para varios números diferentes, así que me gustaría hacer un bucle. Pero insertar la variable de esta manera no funciona:

plot.savefig('hanning', num, '.pdf')

¿Cómo inserto una variable en una cadena de Python?


Consulte también ¿Cómo puedo concatenar objetos str e int? si intentaste usar + para concatenar un número con una cadena (o entre cadenas, etc.) y recibió un mensaje de error.

Si está tratando de ensamblar una URL con datos variables, no haga use el formato de cadena ordinario, porque es propenso a errores y más difícil de lo necesario. Hay herramientas especializadas disponibles. Consulte Agregar parámetros a una URL determinada en Python.

Si está tratando de ensamblar una consulta SQL, no haga utilice el formato de cadena ordinario, porque es un importante riesgo de seguridad. Esta es la causa de la “inyección SQL” que cuesta a las empresas reales enormes cantidades de dinero cada año. Consulte, por ejemplo, Python: mejores prácticas y la forma más segura de conectarse a MySQL y ejecutar consultas para conocer las técnicas adecuadas.

Avatar de usuario de Dan McDougall
dan mcdougall

Usando cuerdas f:

plot.savefig(f'hanning{num}.pdf')

Esto se agregó en 3.6 y es la nueva forma preferida.


Usando str.format():

plot.savefig('hanning{0}.pdf'.format(num))

Concatenación de cadenas:

plot.savefig('hanning' + str(num) + '.pdf')

Especificador de conversión:

plot.savefig('hanning%s.pdf' % num)

Usando nombres de variables locales (buen truco):

plot.savefig('hanning%(num)s.pdf' % locals())

Usando string.Template:

plot.savefig(string.Template('hanning${num}.pdf').substitute(locals()))

Ver también:

  • Para usar el operador de cadena de formato con múltiples argumentos, se puede usar una tupla como operando: 'foo %d, bar %d' % (foo, bar).

    – campo

    8 de agosto de 2014 a las 15:38

  • Tu ingenioso truco también funciona con la nueva sintaxis de formato: plot.savefig('hanning{num}s.pdf'.format(**locals()))

    – foto

    10 oct 2014 a las 4:30

  • tenía problemas para usar locales () dentro de una función que llamaba a una variable global; usó % globals() en su lugar, que funcionó

    – lobi

    14 de febrero de 2020 a las 12:40


  • “Debería haber uno – y preferiblemente solo uno — forma obvia de hacerlo”.

    – MAChitgarha

    15 de agosto de 2021 a las 21:38

  • @MAChitgarha: ilusiones, pero no algo que pueda sostenerse para un idioma que ha evolucionado con el tiempo.

    – martineau

    7 de febrero a las 23:58

Con la introducción de literales de cadena con formato (“f-strings” para abreviar) en Python 3.6, ahora es posible escribir esto con una sintaxis más breve:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'

Con el ejemplo dado en la pregunta, se vería así

plot.savefig(f'hanning{num}.pdf')

  • Parece que las cadenas f son compatibles con las cadenas multilínea.

    – Stevoisiak

    30/10/2017 a las 20:23


Avatar de usuario de Amber
Ámbar

plot.savefig('hanning(%d).pdf' % num)

los % operador, cuando sigue una cadena, le permite insertar valores en esa cadena a través de códigos de formato (el %d en este caso). Para obtener más detalles, consulte la documentación de Python:

printfFormato de cadena de estilo

  • Tenga en cuenta que el % operador está en desuso a partir de Python 3.1. La nueva forma preferida es hacer uso de la .format() método como se discutió en PEP 3101 y mencionado en la respuesta de Dan McDougall.

    – Chris Müller

    16 de julio de 2015 a las 14:18


  • los % operator no está en desuso, simplemente no es la forma preferida ahora.

    – kaya3

    13 de septiembre de 2021 a las 12:59

avatar de usuario de goggin13
goggin13

Puedes usar + como la función normal de concatenación de cadenas, así como str().

"hello " + str(10) + " world" == "hello 10 world"

Avatar de usuario de Yehonatan
Yehonatán

En general, puede crear cadenas usando:

stringExample = "someString " + str(someNumber)
print(stringExample)
plot.savefig(stringExample)

Avatar de usuario de Jonathan R
jonathan r

Si desea poner varios valores en la cadena, puede utilizar format

nums = [1,2,3]
plot.savefig('hanning{0}{1}{2}.pdf'.format(*nums))

Daría como resultado la cadena hanning123.pdf. Esto se puede hacer con cualquier matriz.

Avatar de usuario de Raja
Raja

Necesitaba una versión extendida de esto: en lugar de incrustar un solo número en una cadena, necesitaba generar una serie de nombres de archivo de la forma ‘archivo1.pdf’, ‘archivo2.pdf’, etc. Así es como trabajó:

['file' + str(i) + '.pdf' for i in range(1,4)]

  • La comprensión de la lista no es relevante para la pregunta de OP, y la técnica de formato de cadena que está utilizando ya está cubierta en la respuesta principal y la respuesta de goggin13. No publique respuestas que respondan a una pregunta diferente o soluciones duplicadas. Consulte Cómo responder. En cualquier caso, no hay razón para usar manualmente str(); es mucho más fácil usar f-strings, por ejemplo: f'file{i}.pdf'

    – wjandrea

    24 de julio a las 18:39


¿Ha sido útil esta solución?