2013-08-22 25 views
9

Chciałbym dodać kilka znaków na początku każdej linii.Dodaj niektóre znaki na początku każdej linii

Jak mogę to zrobić?

robiłem że:

'\n\t\t\t'.join(myStr.splitlines())

Ale to nie jest doskonałe i chciałbym wiedzieć, czy istnieją lepsze sposoby, aby to zrobić. Pierwotnie chcę automatycznie wciskać cały blok tekstu.

Odpowiedz

8

Myślę, że to całkiem niezła metoda. Jedną rzeczą, którą możesz ulepszyć, jest to, że twoja metoda wprowadza wiodący znak nowej linii i usuwa wszelkie ciągłe znaki nowej linii. To nie będzie:

'\t\t\t'.join(myStr.splitlines(True)) 

From the docs:

str.splitlines ([]) keepends

zwróci listę linii w ciągu, zerwania w granicach linii. Ta metoda wykorzystuje podejście uniwersalne do linii podziału linii. Podziały linii nie są uwzględniane na liście wynikowej , chyba że podana wartość jest podana i prawdziwa.

Ponadto, chyba że ciąg rozpoczyna się od nowej linii, nie dodajemy żadnych kart na początku łańcucha, więc może chcieć to zrobić też:

'\t\t\t'.join(('\n'+myStr.lstrip()).splitlines(True)) 
+0

Nie wiedziałem, że dzięki! – JeromeJ

1

elastycznych opcjonalnie, możesz chcieć rzucić okiem na textwrap w standardowej bibliotece.

Przykład:

>>> hamlet='''\ 
... To be, or not to be: that is the question: 
... Whether 'tis nobler in the mind to suffer 
... The slings and arrows of outrageous fortune, 
... Or to take arms against a sea of troubles, 
... And by opposing end them? To die: to sleep; 
... No more; and by a sleep to say we end 
... ''' 
>>> import textwrap 
>>> wrapper=textwrap.TextWrapper(initial_indent='\t', subsequent_indent='\t'*2) 
>>> print wrapper.fill(hamlet) 
    To be, or not to be: that is the question: Whether 'tis nobler in the 
     mind to suffer The slings and arrows of outrageous fortune, Or to 
     take arms against a sea of troubles, And by opposing end them? To 
     die: to sleep; No more; and by a sleep to say we end 

Widać, że nie tylko można łatwo dodać elastyczną przestrzeń z przodu każdej linii, można przyciąć, aby dopasować każdą linię, wyrazy, rozwiń zakładki itp

będzie zawijać (stąd nazwa) linie, które stają się zbyt długo, bo z dodatkami z przodu:

>>> wrapper=textwrap.TextWrapper(initial_indent='\t'*3, 
... subsequent_indent='\t'*4, width=40) 
>>> print wrapper.fill(hamlet) 
      To be, or not to be: that is the 
       question: Whether 'tis nobler in the 
       mind to suffer The slings and arrows 
       of outrageous fortune, Or to take 
       arms against a sea of troubles, And 
       by opposing end them? To die: to 
       sleep; No more; and by a sleep to 
       say we end 

Bardzo elastyczne i użyteczne.

Edit

Jeśli chcesz zachować znaczenie zakończeń linii w tekście z odpychania tekstu, wystarczy połączyć odpychania tekstu z splitlines zachować linię zakończeń samo.

Przykład tiret wiszące:

import textwrap 

hamlet='''\ 
Hamlet: In the secret parts of Fortune? O, most true! She is a strumpet. What's the news? 
Rosencrantz: None, my lord, but that the world's grown honest. 
Hamlet: Then is doomsday near.''' 

wrapper=textwrap.TextWrapper(initial_indent='\t'*1, 
          subsequent_indent='\t'*3, 
          width=30) 

for para in hamlet.splitlines(): 
    print wrapper.fill(para) 
    print 

drukuje

Hamlet: In the secret parts 
     of Fortune? O, most true! 
     She is a strumpet. What's 
     the news? 

Rosencrantz: None, my lord, 
     but that the world's grown 
     honest. 

Hamlet: Then is doomsday 
     near. 
+0

Czy możemy, być może, zachować separator nowego typu linii (\ n, \ r \ n lub \ r, jeśli mam rację), tak jak to robi 'str.splitlines (True)'?Będę bliżej przyjrzeć się temu modułowi, ale wygląda to zgrabnie! – JeromeJ

+0

(... (2) czy może jest to całkowicie bezużyteczne i lepiej użyć tylko "\ n" wszędzie?) – JeromeJ

+0

@JeromeJ: Dlaczego mówisz, że jest bezużyteczny? W zasadzie to [wcale nie jest trywialne] (http://hg.python.org/cpython/file/2.7/Lib/textwrap.py) co robi textwrap. Pomyśl o zawijaniu słów w edytorze tekstu. Jeśli dodasz 3 zakładki na początku linii, co stanie się, gdy linia będzie zbyt długa, aby wyświetlić ją w danym miejscu? Ta biblioteka umożliwia dodanie spacji na początku każdej linii i zawijanie wszystkich pozostałych wierszy, jeśli ta spacja powoduje, że linia jest zbyt szeroka. Jak to jest bezużyteczne? – dawg

Powiązane problemy