2012-02-15 15 views
8

Qual è il modo migliore per formattare un grande blob di testo in python? Non intendo la formattazione dell'output, ma piuttosto la leggibilità. Ho cercato di seguire lo guidelines for python layout, ma non vedo alcuna osservazione su come formattare un grande blob di testo.Python Formatting Large Text

Ad esempio:

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: 
""" 

Il grande blocco di testo appare terribile e non è rientrato da 4 spazi, quindi è difficile da leggere.

Cosa ho piacerebbe vedere è:

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: 
    """ 

ma questo introduce uno spazio bianco per l'inizio della produzione.

Qualche idea su come posso farlo seguire il layout consigliato per python? Mi piacerebbe tenerlo pulito e facile da leggere.

È possibile farlo senza stampare per ciascuna riga? per esempio.

Quanto sopra è il modo in cui mi piacerebbe che il codice venga visualizzato, senza ricorrere a una stampa su ciascuna riga.

risposta

17

La libreria standard dispone di strumenti per questo:

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

Funziona perfettamente Grazie! – Rastapopulous

1

I valori letterali di stringa adiacenti vengono concatenati automaticamente.

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

Questo violerebbe i non più di 79 caratteri su una regola di linea dal libro di stile Python. – Rastapopulous

+0

Questo è probabilmente solo un suggerimento che punta alla risposta di Irfy. – yak

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

Lo faccio spesso per stringhe molto lunghe.

+0

Quindi questo è simile a fare una stampa su ogni linea. Avrò ancora bisogno di aggiungere un \ n alla fine di ogni riga - speravo di evitarlo usando "" " – Rastapopulous

+0

* Visivamente * è come stampare su ogni riga, ma internamente è più simile a una singola stringa. Penso che la risposta di campos.ddc sia la migliore per quello che stai cercando, ma richiede la post-elaborazione della stringa in fase di esecuzione – Irfy

0

Si potrebbe utilizzare il vostro indentantion preferito, e rimuovere le schede in seguito:

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

Se stai usando la spaziatura per i rientri (in base alla spaziatura dei documenti di python è preferibile) allora questo – Rastapopulous

1

Io di solito faccio qualcosa di simile:

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:', 
    ]) 

Come consente il riarrangiamento (relativamente) facile e l'aggiunta di nuove linee.

+0

Questo codice non funziona e ha troppa punteggiatura in più. –

+0

Woops, il mio male sul non eseguito, e corretto. La punteggiatura extra (il \\) è il mantenimento da standard di codifica nel mio lavoro, dove vogliono che iniziamo una continuazione di linea.Non sono necessari per il codice effettivo. – michaelfilms

+1

Perché mai useresti i continuatori della linea di backslash quando non ne hai bisogno! Yikes. –