2012-02-15 17 views
8

¿Cuál es la mejor forma de formatear una gran cantidad de texto en python? No me refiero al formateo de la salida, sino a la legibilidad. Intenté seguir el guidelines for python layout, pero no veo ningún comentario sobre cómo formatear una gran cantidad de texto.Python Formatear texto grande

Por ejemplo:

class GenerateCalendar(object): 
def __init__(self): 
    super(GenerateCalendar, self).__init__() 

def getCalendarHeader(self): 
    print """ 
BEGIN:VCALENDAR 
PRODID:-//Atlassian Software Systems//Confluence Calendar Plugin//EN 
VERSION:2.0 
CALSCALE:GREGORIAN 
X-WR-CALNAME;VALUE=TEXT: 
X-WR-CALDESC;VALUE=TEXT: 
""" 

El gran bloque de texto se ve terrible y no es una sangría por 4 espacios, por lo que es difícil de leer.

¿Qué he gustaría ver es:

def getCalendarHeader(self): 
    print """ 
    BEGIN:VCALENDAR 
    PRODID:-//Atlassian Software Systems//Confluence Calendar Plugin//EN 
    VERSION:2.0 
    CALSCALE:GREGORIAN 
    X-WR-CALNAME;VALUE=TEXT: 
    X-WR-CALDESC;VALUE=TEXT: 
    """ 

pero esto introduce un espacio en blanco al principio de la salida.

¿Alguna idea sobre cómo puedo hacer que esto siga el diseño recomendado para Python? Me gustaría mantenerlo ordenado y fácil de leer.

¿Es posible hacerlo sin hacer una impresión para cada línea? p.ej.

def getCalendarHeader(self): 
    print "BEGIN:VCALENDAR\n" 
    print "PRODID:-//Atlassian Software Systems//Confluence Calendar Plugin//EN\n" 
    print "VERSION:2.0\n" 
    print "CALSCALE:GREGORIAN\n" 
    print "X-WR-CALNAME;VALUE=TEXT:\n" 
    print "X-WR-CALDESC;VALUE=TEXT:\n" 

Lo anterior es la forma en que me gusta tener el código aparecerá, sin tener que recurrir a hacer una impresión en cada línea.

Respuesta

17

La biblioteca estándar tiene herramientas para esto:

import textwrap 

#... 

    def getCalendarHeader(self): 
     print textwrap.dedent("""\ 
      BEGIN:VCALENDAR 
      PRODID:-//Atlassian Software Systems//Confluence Calendar Plugin//EN 
      VERSION:2.0 
      CALSCALE:GREGORIAN 
      X-WR-CALNAME;VALUE=TEXT: 
      X-WR-CALDESC;VALUE=TEXT: 
      """) 
+0

Funciona perfectamente. Gracias! – Rastapopulous

1

Los literales de cadena adyacentes se concatenan automáticamente.

>>> 'x' 'y' 
'xy' 
+2

Esto violaría los no más de 79 caracteres en una regla de línea del libro de estilo python. – Rastapopulous

+0

Eso es probablemente solo una pista que apunta a la respuesta de Irfy. – yak

0
print("first line\n" 
     "second line\n" 
     "first part of third line" 
     "rest of third line\n") 

hago esto a menudo por cadenas muy largas.

+0

Esto es similar a hacer una impresión en cada línea. Todavía necesitaré agregar \ n al final de cada línea. Esperaba evitar esto usando "" " – Rastapopulous

+0

* Visualmente * es como imprimir en cada línea, pero internamente, es más como una sola cadena. Creo que la respuesta de campos.ddc es la mejor para lo que estás buscando, pero requiere un postprocesamiento en tiempo de ejecución de la cadena. – Irfy

0

Usted podría utilizar su indentantion favorito, y quitar las pestañas después:

def getCalendar(): 
    return ''' 
    Text here 
    Text here 
    Text here 
    Text here 
    '''.replace('\t', '') 
+1

Si usas espaciado para sangrías (de acuerdo con el espacio de doc de python es preferible) entonces esto no funciona – Rastapopulous

1

Me suelen hacer algo como esto:

print '\n'.join([ 
    'BEGIN:VCALENDAR', 
    'PRODID:-//Atlassian Software Systems//Confluence Calendar Plugin//EN', 
    'VERSION:2.0', 
    'CALSCALE:GREGORIAN', 
    'X-WR-CALNAME;VALUE=TEXT:', 
    'X-WR-CALDESC;VALUE=TEXT:', 
    ]) 

, ya que permite la reorganización (relativamente) fácil y la adición de nuevas líneas.

+0

Este código no se ejecuta, y tiene demasiada puntuación adicional –

+0

Woops, mi mal en el no se ejecuta, y corregido. La puntuación extra (el \\) es holdover de Estándares de codificación en mi trabajo, donde quieren que establezcamos una continuación de línea. No son necesarios para el código real. – michaelfilms

+1

¿Por qué demonios usarías los continuadores de líneas de barra invertida cuando no necesitaras? Yikes. –

Cuestiones relacionadas