Odpowiedzi:
Możesz to zrobić za pomocą str.ljust(width[, fillchar])
:
Zwraca ciąg wyrównany do lewej w ciągu o długości szerokości . Wypełnianie odbywa się przy użyciu określonego fillchar (domyślnie jest to spacja). Oryginalny ciąg znaków jest zwracany, jeśli szerokość jest mniejsza niż
len(s)
.
>>> 'hi'.ljust(10)
'hi '
Aby uzyskać elastyczną metodę, która działa nawet podczas formatowania skomplikowanego łańcucha, prawdopodobnie powinieneś użyć mini-języka formatującego łańcuch , używając jednej z str.format()
metod
>>> '{0: <16} StackOverflow!'.format('Hi') # Python >=2.6
'Hi StackOverflow!'
>>> f'{"Hi": <16} StackOverflow!' # Python >= 3.6
'Hi StackOverflow!'
'{message: <{fill}}'.format(message='Hi', fill='16')
str.format()
dla szablonów zawierających tylko jeden {...}
i nic więcej. Wystarczy skorzystać z format()
funkcji i oszczędzić sobie parsowania napowietrznych: format('Hi', '<16')
.
Nowa metoda formatowania łańcucha znaków (ish) pozwala robić zabawne rzeczy z zagnieżdżonymi argumentami słów kluczowych. Najprostszy przypadek:
>>> '{message: <16}'.format(message='Hi')
'Hi '
Jeśli chcesz przekazać 16
jako zmienną:
>>> '{message: <{width}}'.format(message='Hi', width=16)
'Hi '
Jeśli chcesz przekazać zmienne dla całego zestawu i kaboodle :
'{message:{fill}{align}{width}}'.format(
message='Hi',
fill=' ',
align='<',
width=16,
)
Które wyniki w (zgadłeś):
'Hi '
Możesz spróbować:
print "'%-100s'" % 'hi'
"'%+100s'" % 'hi'
będzie działać na umieszczenie spacji po prawej stronie'hi'
Prawidłowym sposobem na to byłoby użycie składni formatu Pythona, jak opisano w oficjalnej dokumentacji
W tym przypadku byłoby to po prostu:
'{:10}'.format('hi')
które dane wyjściowe:
'hi '
Wyjaśnienie:
format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]
fill ::= <any character>
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= integer
precision ::= integer
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
Jest tam prawie wszystko, co musisz wiedzieć ^.
Aktualizacja: od Pythona 3.6 jest jeszcze wygodniejsza z interpolacją ciągów literalnych!
foo = 'foobar'
print(f'{foo:10} is great!')
# foobar is great!
Użyj str.ljust()
:
>>> 'Hi'.ljust(6)
'Hi '
Należy również rozważyć string.zfill()
, str.ljust()
a str.center()
do formatowania strun. Można je łączyć w łańcuchy i mieć znak „ wypełnienia ”, a zatem:
>>> ('3'.zfill(8) + 'blind'.rjust(8) + 'mice'.ljust(8, '.')).center(40)
' 00000003 blindmice.... '
Te operacje formatowania łańcuchaZaletą jest praca w Pythonie v2 i v3.
Spójrz pydoc str
kiedyś: jest tam mnóstwo dobrych rzeczy.
Od wersji Python 3.6 możesz to zrobić
>>> strng = 'hi'
>>> f'{strng: <10}'
z dosłowną interpolacją ciągów znaków .
Lub, jeśli twój rozmiar wypełnienia jest w zmiennej, taki jak ten (dzięki @Matt M.!):
>>> to_pad = 10
>>> f'{strng: <{to_pad}}'
f'{strng: >10}'
do wypełniania łańcucha wiodącymi białymi spacjami do długości 10. To magia. I nie jest to dobrze udokumentowane.
f'{strng:10}'
.
Użyj mini formatowania Python 2.7 dla ciągów :
'{0: <8}'.format('123')
To pozostawia wyrównanie i dopełnia do 8 znaków ze znakiem „”.
Wystarczy usunąć 0, a zamiast tego doda miejsce:
>>> print "'%6d'"%4
Czy nie byłoby bardziej pytoniczne stosowanie krojenia?
Na przykład, aby wstawić ciąg znaków ze spacjami po prawej stronie, aż będzie miał 10 znaków:
>>> x = "string"
>>> (x + " " * 10)[:10]
'string '
Aby uzupełnić go spacjami po lewej stronie, aż będzie miał 15 znaków:
>>> (" " * 15 + x)[-15:]
' string'
Wymaga to oczywiście wiedzy, jak długo chcesz uzupełniać, ale nie wymaga mierzenia długości łańcucha, od którego zaczynasz.
''.join(reversed(str))
bardziej pytoniczne niż str[::-1]
i wszyscy wiemy, że to nieprawda.
(x + " " * 10)[:10]
moim zdaniem jest znacznie bardziej skomplikowany niż używanie x.ljust(10)
.
Fajna sztuczka, którą można zastosować zamiast różnych formatów wydruku:
(1) Pad ze spacjami po prawej:
('hi' + ' ')[:8]
(2) Pad z wiodącymi zerami po lewej stronie:
('0000' + str(2))[-4:]
min_len = 8
wtedy ('hi' + ' '*min_len)[:min_len]
lub('0'*min_len + str(2))[-min_len]
('0'*min_len + str(2))[-min_len:]
raczej, choć jest to tylko dla zabawy i polecam inne odpowiedzi.
Mógłbyś to zrobić przy użyciu listowania, to dałoby ci wyobrażenie o liczbie spacji i byłby to jeden linijka.
"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello '
s = "hi"
; s + (6-len(s)) * " "
zamiast tego (jest OK, kiedy wynik jest negatywny). Jednak odpowiedzi, które wykorzystują jakąkolwiek funkcję frameworku, która rozwiązuje konkretny problem, będą łatwiejsze do utrzymania (zobacz inne odpowiedzi)
"%-6s" % s
do wyrównania do lewej i wyrównania"%6s" % s
do prawej.