¿Cómo usar la nueva línea ‘\ n’ en f-string para formatear la salida en Python 3.6?

7 minutos de lectura

avatar de usuario
malmetido

Me gustaría saber cómo formatear este caso de forma Pythonic con f-strings:

names = ['Adam', 'Bob', 'Cyril']
text = f"Winners are:\n{'\n'.join(names)}"
print(text)

El problema es ese '\' no se puede utilizar dentro del {...} partes de expresión de una cadena f. Rendimiento esperado:

Winners are:
Adam
Bob
Cyril

  • f"Winners are:\n{chr(10).join(names)}"

    – Wim

    27 de junio de 2017 a las 13:06

avatar de usuario
Dimitris Fasarakis Hilliard

no puedes Las barras invertidas no pueden aparecer dentro de las llaves {}; hacerlo resulta en un SyntaxError:

>>> f'{\}'
SyntaxError: f-string expression part cannot include a backslash

Esto se especifica en el ENERGÍA para cuerdas f:

Es posible que las barras invertidas no aparezcan dentro de las partes de expresión de f-strings, […]

Una opción es asignar '\n' a un nombre y luego .join en eso dentro de la f-cuerda; es decir, sin usar un literal:

names = ['Adam', 'Bob', 'Cyril']
nl="\n"
text = f"Winners are:{nl}{nl.join(names)}"
print(text)

Resultados en:

Winners are:
Adam
Bob
Cyril

Otra opción, según lo especificado por @wim, es usar chr(10) Llegar \n regresó y luego unirse allí. f"Winners are:\n{chr(10).join(names)}"

Otro, por supuesto, es '\n'.join de antemano y luego agregue el nombre en consecuencia:

n = "\n".join(names)
text = f"Winners are:\n{n}"

lo que da como resultado la misma salida.

Nota:

Esta es una de las pequeñas diferencias entre f-cuerdas y str.format. En este último, siempre puede usar la puntuación siempre que se haya desempaquetado un dictado loco correspondiente que contenga esas claves:

>>> "{\\} {*}".format(**{"\\": 'Hello', "*": 'World!'})
"Hello World!"

(Por favor, no hagas esto.)

En el primero, la puntuación no está permitida porque no puede tener identificadores que los usen.


Aparte: definitivamente optaría por print o format, como sugieren las otras respuestas como alternativa. Las opciones que he dado solo se aplican si deber por alguna razón use f-strings.

El hecho de que algo sea nuevo no significa que debas intentar hacer todo con él 😉

  • Para mí no tiene sentido: nl = '\n' text = f"Winners are:{nl}". Use: text = f”Los ganadores son:\n”

    – Timo

    7 de enero de 2021 a las 19:10

  • @Timo OP necesitaba join en \n en una cadena de formato, específicamente en la expresión incrustada.

    – Dimitris Fasarakis Hilliard

    8 de enero de 2021 a las 8:15

  • Creo que el punto de @timo fue el primero {nl} no era necesario, ya que \n no está dentro de la porción de expresión de la cadena f. text = f"Winners are:\n" está perfectamente bien, es el {"\n".join()} porción que causa problemas dentro de una f-string.

    – sam

    3 ene a las 23:59


  • ¿Alguna idea de por qué las cuerdas f están limitadas de esta manera? En JavaScript, por ejemplo, no existe tal limitación en las expresiones que puede colocar dentro de una plantilla de cadena.

    -Ron Inbar

    10 de marzo a las 15:06


  • @RonInbar en Python hay otras dos formas de formatear cadenas que no dan esa limitación y ya existían antes de f-strings, que son '%s' % ('\n') y '{}'.format('\n')

    – Iuri Guilherme

    1 de julio a las 21:59

avatar de usuario
Eugene Yarmash

No necesita f-strings u otros formateadores para imprimir una lista de cadenas con un separador. solo usa el sep argumento de palabra clave para print():

names = ['Adam', 'Bob', 'Cyril']
print('Winners are:', *names, sep='\n')

Producción:

Winners are:
Adam
Bob
Cyril

Dicho esto, usando str.join()/str.format() aquí podría decirse que sería más simple y más legible que cualquier solución alternativa de f-string:

print('\n'.join(['Winners are:', *names]))
print('Winners are:\n{}'.format('\n'.join(names)))

  • La mejor respuesta hasta ahora. Utilizo el desempaquetado de estrellas en la función de impresión todo el tiempo en estos días para echar un vistazo dentro de algún objeto, por ejemplo print(*dir(some_object), sep='\n') o print(*vars(some_object), sep='\n').

    – Rick apoya a Mónica

    27 de junio de 2017 a las 13:41


  • ¿Qué hace si no desea imprimir la lista directamente, por ejemplo, si se la pasa a un registrador?

    – Beto

    3 de febrero de 2020 a las 15:47

  • @bob: entonces solo usa str.join(): text = '\n'.join(['Winners are:', *names]). POR CIERTO, print() se puede usar para escribir cualquier archivo (especificado con el file argumento, sys.stdout por defecto).

    – Eugene Yarmash

    3 de febrero de 2020 a las 20:38


avatar de usuario
Chris_Rands

No puede usar barras invertidas en f-strings como han dicho otros, pero puede evitar esto usando os.linesep (aunque tenga en cuenta que esto no será \n en todas las plataformas, y no se recomienda a menos que lea/escriba archivos binarios; ver los comentarios de Rick):

>>> import os
>>> names = ['Adam', 'Bob', 'Cyril']
>>> print(f"Winners are:\n{os.linesep.join(names)}")
Winners are:
Adam
Bob
Cyril 

O tal vez de una manera menos legible, pero garantizado para ser \ncon chr():

>>> print(f"Winners are:\n{chr(10).join(names)}")
Winners are:
Adam
Bob
Cyril

  • No fui yo, pero usando os.linesep es no es Buena idea al escribir texto.

    – Rick apoya a Mónica

    27/06/2017 a las 13:30


  • @RickTeachey Ya agregué la advertencia entre paréntesis y sugerí un enfoque alternativo. De todos modos, el OP está imprimiendo en la pantalla, no escribiendo en un archivo abierto en modo de texto

    – Chris_Rands

    27 de junio de 2017 a las 13:34


  • No creo que importe. os.linesep es solo para leer, o leer y escribir en modo binario. Sé que funcionará igual en este caso, pero es un mal hábito para empezar. Pero de nuevo: yo no fui el voto negativo. La advertencia es lo suficientemente buena para mí. 🙂

    – Rick apoya a Mónica

    27 de junio de 2017 a las 13:45

avatar de usuario
Rick apoya a Mónica

Las otras respuestas dan ideas sobre cómo colocar el carácter de nueva línea en un campo de cadena f. Sin embargo, diría que para el ejemplo que dio OP (que puede o no ser indicativo del caso de uso real de OP), ninguna de estas ideas debería usarse.

El objetivo de usar f-strings es aumentar la legibilidad del código. No hay nada que puedas hacer con f-strings que no puedas hacer con format. Considere cuidadosamente si hay algo más legible sobre esto (si pudieras hacerlo):

f"Winners are:\n{'\n'.join(names)}"

…o esto:

newline="\n"
f"Winners are:\n{newline.join(names)}"

…o esto:

"Winners are:\n{chr(10).join(names)}"

contra esto:

"Winners are:\n{}".format('\n'.join(names))

La última forma es al menos igual de legible, si no más.

En resumen: no use un martillo cuando necesite un destornillador solo porque tiene uno nuevo y brillante. El código se lee mucho más a menudo de lo que se escribe.

Para otros casos de uso, sí, es posible que el chr(10) idea o newline la idea puede ser apropiada. Pero no para el dado.

print(f'{"blah\n"}')

La declaración anterior planteará SyntaxErrorPero para evitar el error, simplemente puede asignar la cadena que contiene \n a una variable y usarla en f-string.

x = "blah\n"
print(f'{x}')

avatar de usuario
chico de Hong Kong

Si (¡y solo si!) la legibilidad es la principal prioridad, y la velocidad realmente no es un factor, las cadenas f son muy útiles para hacer que una función simple se autodocumente, incluso si hay formas más simples de programarla. La legibilidad se maximiza con f-strings cuando: (1) las declaraciones que cambian el estado del argumento son claramente obvias, y (2) cuando los argumentos se imprimen, la declaración de impresión se formatea cuidadosamente y se presenta visualmente para que los argumentos se destaquen:

'''
function to print out an identification header, consisting
of the programmer supplied title, lastname, and firstname:
''' 
FORMAT_DATE = "%m-%d-%y %H:%M:%S"

date_and_time = datetime.now()
name_line = f"* {lastname}, {firstname}"
title_line = f"* {title}"
date_line = f"* {date_and_time.strftime(FORMAT_DATE)}"
print(name_line
    + '\n'
    + title_line
    + '\n'
    + date_line)

producción:

* Lovelace, Ada
* Bernoulli Numbers algorithm implemented in Python
* 10-28-42 20:13:22

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad