Szukaj…


Wprowadzenie

Podczas przechowywania i przekształcania danych, aby ludzie mogli je zobaczyć, formatowanie ciągów może stać się bardzo ważne. Python oferuje szeroką gamę metod formatowania ciągów, które zostały opisane w tym temacie.

Składnia

  • „{}”. format (42) ==> „42”
  • „{0}”. Format (42) ==> „42”
  • „{0: .2f}”. Format (42) ==> „42,00”
  • „{0: .0f}”. Format (42.1234) ==> „42”
  • „{answer}”. format (no_answer = 41, answer = 42) ==> „42”
  • „{answer: .2f}”. format (no_answer = 41, answer = 42) ==> „42,00”
  • „{[klucz]}”. format ({„klucz”: „wartość”}) ==> „wartość”
  • „{[1]}”. Format ([„zero”, „one”, „two”]) ==> „one”
  • „{answer} = {answer}”. format (answer = 42) ==> „42 = 42”
  • '' .join (['stack', 'overflow']) ==> „przepełnienie stosu”

Uwagi

  • Należy sprawdzić PyFormat.info, aby uzyskać bardzo dokładne i delikatne wprowadzenie / wyjaśnienie, jak to działa.

Podstawy formatowania łańcucha

foo = 1
bar = 'bar'
baz = 3.14

Możesz użyć str.format do sformatowania wyjścia. Pary wsporników są zastępowane argumentami w kolejności, w jakiej argumenty są przekazywane:

print('{}, {} and {}'.format(foo, bar, baz))
# Out: "1, bar and 3.14"

Indeksy można również podać w nawiasach. Liczby odpowiadają indeksom argumentów przekazywanych do funkcji str.format (na podstawie 0).

print('{0}, {1}, {2}, and {1}'.format(foo, bar, baz))
# Out: "1, bar, 3.14, and bar"
print('{0}, {1}, {2}, and {3}'.format(foo, bar, baz))
# Out: index out of range error

Można również użyć nazwanych argumentów:

print("X value is: {x_val}. Y value is: {y_val}.".format(x_val=2, y_val=3))
# Out: "X value is: 2. Y value is: 3."

Do atrybutów obiektu można się odwoływać po przekazaniu do str.format :

class AssignValue(object):
    def __init__(self, value):
        self.value = value
my_value = AssignValue(6)
print('My value is: {0.value}'.format(my_value))  # "0" is optional
# Out: "My value is: 6"

Można również użyć klawiszy słownika:

my_dict = {'key': 6, 'other_key': 7}
print("My other key is: {0[other_key]}".format(my_dict))  # "0" is optional
# Out: "My other key is: 7"

To samo dotyczy indeksów list i krotek:

my_list = ['zero', 'one', 'two']
print("2nd element is: {0[2]}".format(my_list))  # "0" is optional
# Out: "2nd element is: two"

Uwaga: Oprócz str.format , Python udostępnia również operator modulo % znany również jako operator formatowania lub interpolacji łańcucha (patrz PEP 3101 ) - do formatowania ciągów. str.format jest następcą % i oferuje większą elastyczność, na przykład ułatwiając przeprowadzanie wielokrotnych zamian.

Oprócz indeksów argumentów możesz także zawrzeć specyfikację formatu w nawiasach klamrowych. Jest to wyrażenie, które następuje szczególne zasady i musi być poprzedzona dwukropkiem ( : ). Zobacz dokumentację, aby uzyskać pełny opis specyfikacji formatu. Przykładem specyfikacji formatu jest dyrektywa wyrównująca :~^20 ( ^ oznacza wyrównanie do środka, całkowitą szerokość 20, wypełnij znakiem ~):

'{:~^20}'.format('centered')
# Out: '~~~~~~centered~~~~~~'

format pozwala na zachowanie niemożliwe z % , na przykład powtarzanie argumentów:

t = (12, 45, 22222, 103, 6)
print '{0} {2} {1} {2} {3} {2} {4} {2}'.format(*t)    
# Out: 12 22222 45 22222 103 22222 6 22222

Ponieważ format jest funkcją, może być używany jako argument w innych funkcjach:

number_list = [12,45,78]
print map('the number is {}'.format, number_list)
# Out: ['the number is 12', 'the number is 45', 'the number is 78']   
    

from datetime import datetime,timedelta
    
once_upon_a_time = datetime(2010, 7, 1, 12, 0, 0)
delta = timedelta(days=13, hours=8,  minutes=20)
    
gen = (once_upon_a_time + x * delta for x in xrange(5))
    
print '\n'.join(map('{:%Y-%m-%d %H:%M:%S}'.format, gen))
#Out: 2010-07-01 12:00:00
#     2010-07-14 20:20:00
#     2010-07-28 04:40:00
#     2010-08-10 13:00:00
#     2010-08-23 21:20:00

Wyrównanie i wypełnienie

Python 2.x 2.6

Metoda format() może być użyta do zmiany wyrównania ciągu. Musisz to zrobić za pomocą wyrażenia formatu formularza :[fill_char][align_operator][width] gdzie align_operator jest jednym z:

  • < wymusza wyrównanie pola do lewej w obrębie width .
  • > wymusza wyrównanie pola do width .
  • ^ wymusza wyśrodkowanie pola na width .
  • = wymusza wstawianie dopełnienia po znaku (tylko typy numeryczne).

fill_char (jeśli pominięto wartość domyślną to spacja) to znak użyty do wypełnienia.

'{:~<9s}, World'.format('Hello')
# 'Hello~~~~, World'

'{:~>9s}, World'.format('Hello')
# '~~~~Hello, World'

'{:~^9s}'.format('Hello')
# '~~Hello~~'

'{:0=6d}'.format(-123)
# '-00123'

Uwaga: te same wyniki można osiągnąć za pomocą funkcji łańcuchowych ljust() , rjust() , center() , zfill() , jednak funkcje te są przestarzałe od wersji 2.5.

Formatuj literały (ciąg F)

Ciągi formatów literałów zostały wprowadzone w PEP 498 (Python3.6 i nowsze wersje), pozwalając ci poprzedzać literą f początek łańcucha literału, aby skutecznie zastosować do niego .format ze wszystkimi zmiennymi w bieżącym zakresie.

>>> foo = 'bar'
>>> f'Foo is {foo}'
'Foo is bar'

Działa to również z bardziej zaawansowanymi ciągami formatu, w tym wyrównaniem i notacją kropkową.

>>> f'{foo:^7s}'
'  bar  '

Uwaga: f'' nie oznacza określonego typu, takiego jak b'' dla bytes lub u'' dla unicode w python2. Formowanie jest natychmiast nakładane, co powoduje normalne mieszanie.

Ciągi formatu można również zagnieżdżać :

>>> price = 478.23
>>> f"{f'${price:0.2f}':*>20s}"
'*************$478.23'

Wyrażenia w łańcuchu f są oceniane w kolejności od lewej do prawej. Można to wykryć tylko wtedy, gdy wyrażenia mają skutki uboczne:

>>> def fn(l, incr):
...    result = l[0]
...    l[0] += incr
...    return result
...
>>> lst = [0]
>>> f'{fn(lst,2)} {fn(lst,3)}'
'0 2'
>>> f'{fn(lst,2)} {fn(lst,3)}'
'5 7'
>>> lst
[10]

Formatowanie ciągów z datetime

Każda klasa może skonfigurować własną składnię formatowania łańcucha za pomocą metody __format__ . Typem w standardowej bibliotece Pythona, który jest przydatny, jest typ datetime , w którym można używać kodów formatujących podobnych do strftime bezpośrednio w str.format :

>>> from datetime import datetime
>>> 'North America: {dt:%m/%d/%Y}.  ISO: {dt:%Y-%m-%d}.'.format(dt=datetime.now())
'North America: 07/21/2016.  ISO: 2016-07-21.'

Pełna lista formatów daty i godziny znajduje się w oficjalnej dokumentacji .

Sformatuj za pomocą Getitem i Getattr

Każda struktura danych obsługująca __getitem__ może mieć sformatowaną strukturę zagnieżdżoną:

person = {'first': 'Arthur', 'last': 'Dent'} 
'{p[first]} {p[last]}'.format(p=person) 
# 'Arthur Dent'

Dostęp do atrybutów obiektu można uzyskać za pomocą getattr() :

class Person(object):
    first = 'Zaphod'
    last = 'Beeblebrox'

'{p.first} {p.last}'.format(p=Person())
# 'Zaphod Beeblebrox'

Formatowanie zmiennoprzecinkowe

>>> '{0:.0f}'.format(42.12345)
'42'

>>> '{0:.1f}'.format(42.12345)
'42.1'

>>> '{0:.3f}'.format(42.12345)
'42.123'

>>> '{0:.5f}'.format(42.12345)
'42.12345'

>>> '{0:.7f}'.format(42.12345)
'42.1234500'

To samo dotyczy innego sposobu odwoływania się:

>>> '{:.3f}'.format(42.12345)
'42.123'

>>> '{answer:.3f}'.format(answer=42.12345)
'42.123'

Liczby zmiennoprzecinkowe można również sformatować w notacji naukowej lub jako wartości procentowe:

>>> '{0:.3e}'.format(42.12345)
'4.212e+01'

>>> '{0:.0%}'.format(42.12345)
'4212%'

Możesz także łączyć notacje {0} i {name} . Jest to szczególnie przydatne, gdy chcesz zaokrąglić wszystkie zmienne do określonej liczby miejsc po przecinku z 1 deklaracją :

>>> s = 'Hello'
>>> a, b, c = 1.12345, 2.34567, 34.5678
>>> digits = 2

>>> '{0}! {1:.{n}f}, {2:.{n}f}, {3:.{n}f}'.format(s, a, b, c, n=digits)
'Hello! 1.12, 2.35, 34.57'

Formatowanie wartości liczbowych

Metoda .format() może interpretować liczbę w różnych formatach, takich jak:

>>> '{:c}'.format(65)    # Unicode character
'A'

>>> '{:d}'.format(0x0a)  # base 10
'10'

>>> '{:n}'.format(0x0a)  # base 10 using current locale for separators
'10'

Formatuj liczby całkowite do różnych zasad (szesnastkowe, ósemkowe, binarne)

>>> '{0:x}'.format(10) # base 16, lowercase - Hexadecimal
'a'

>>> '{0:X}'.format(10) # base 16, uppercase - Hexadecimal
'A'

>>> '{:o}'.format(10) # base 8 - Octal
'12'

>>> '{:b}'.format(10) # base 2 - Binary
'1010'

>>> '{0:#b}, {0:#o}, {0:#x}'.format(42) # With prefix
'0b101010, 0o52, 0x2a'

>>> '8 bit: {0:08b}; Three bytes: {0:06x}'.format(42) # Add zero padding
'8 bit: 00101010; Three bytes: 00002a'

Użyj formatowania, aby przekonwertować krotkę zmiennoprzecinkową RGB na kolorowy ciąg szesnastkowy:

>>> r, g, b = (1.0, 0.4, 0.0)
>>> '#{:02X}{:02X}{:02X}'.format(int(255 * r), int(255 * g), int(255 * b))
'#FF6600'

Można konwertować tylko liczby całkowite:

>>> '{:x}'.format(42.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Unknown format code 'x' for object of type 'float'

Niestandardowe formatowanie klasy

Uwaga:

Wszystko poniżej dotyczy metody str.format , a także funkcji format . W poniższym tekście oba są wymienne.

Dla każdej wartości przekazywanej do funkcji format Python szuka metody __format__ dla tego argumentu. Twoja własna klasa niestandardowa może w związku z tym mieć własną metodę __format__ celu określenia, w jaki sposób funkcja format wyświetli i sformatuje klasę i jej atrybuty.

Różni się to od metody __str__ , ponieważ w metodzie __format__ można wziąć pod uwagę język formatowania, w tym wyrównanie, szerokość pola itp., A nawet (jeśli chcesz) zaimplementować własne specyfikatory formatu oraz własne rozszerzenia języka formatowania. 1

object.__format__(self, format_spec)

Na przykład :

# Example in Python 2 - but can be easily applied to Python 3

class Example(object):
    def __init__(self,a,b,c):
        self.a, self.b, self.c = a,b,c

    def __format__(self, format_spec):
        """ Implement special semantics for the 's' format specifier """
        # Reject anything that isn't an s
        if format_spec[-1] != 's':
            raise ValueError('{} format specifier not understood for this object', format_spec[:-1])

        # Output in this example will be (<a>,<b>,<c>)
        raw = "(" + ",".join([str(self.a), str(self.b), str(self.c)]) + ")"
        # Honor the format language by using the inbuilt string format
        # Since we know the original format_spec ends in an 's' 
        # we can take advantage of the str.format method with a 
        # string argument we constructed above
        return "{r:{f}}".format( r=raw, f=format_spec )

inst = Example(1,2,3)
print "{0:>20s}".format( inst )
# out :              (1,2,3)
# Note how the right align and field width of 20 has been honored.

Uwaga:

Jeśli twoja klasa niestandardowa nie ma niestandardowej metody __format__ , a instancja klasy jest przekazywana do funkcji format , Python2 zawsze użyje wartości __str__ metodę __repr__ lub metodę __repr__ do określenia, co ma zostać wydrukowane (a jeśli żadna z nich nie istnieje, zostanie użyty domyślny repr ) i będziesz musiał użyć specyfikatora formatu s , aby go sformatować. Z Python3, aby zdać niestandardową klasę do format funkcji, trzeba będzie określić __format__ metody w klasie niestandardowej.

Formatowanie zagnieżdżone

Niektóre formaty mogą przyjmować dodatkowe parametry, takie jak szerokość sformatowanego ciągu lub wyrównanie:

>>> '{:.>10}'.format('foo')
'.......foo'

Można je również podać jako parametry do format , zagnieżdżając więcej {} w {} :

>>> '{:.>{}}'.format('foo', 10)
'.......foo'
'{:{}{}{}}'.format('foo', '*', '^', 15)
'******foo******'

W drugim przykładzie ciąg formatu '{:{}{}{}}' jest modyfikowany do '{:*^15}' (tj. „Środek i pad z * do całkowitej długości 15”) przed zastosowaniem go do rzeczywisty ciąg 'foo' który należy sformatować w ten sposób.

Może to być przydatne w przypadkach, gdy parametry nie są wcześniej znane, na przykład podczas wyrównywania danych tabelarycznych:

>>> data = ["a", "bbbbbbb", "ccc"]
>>> m = max(map(len, data))
>>> for d in data:
...     print('{:>{}}'.format(d, m))
      a
bbbbbbb
    ccc

Wyściełane i obcinane sznurki, połączone

Powiedz, że chcesz wydrukować zmienne w 3-znakowej kolumnie.

Uwaga: podwojenie { i } im ucieka.

s = """

pad
{{:3}}             :{a:3}:

truncate
{{:.3}}            :{e:.3}:

combined
{{:>3.3}}          :{a:>3.3}:
{{:3.3}}           :{a:3.3}:
{{:3.3}}           :{c:3.3}:
{{:3.3}}           :{e:3.3}:
"""

print (s.format(a="1"*1, c="3"*3, e="5"*5))

Wynik:

pad
{:3}             :1  :

truncate
{:.3}            :555:

combined
{:>3.3}          :  1:
{:3.3}           :1  :
{:3.3}           :333:
{:3.3}           :555:

Nazwane symbole zastępcze

Ciągi formatujące mogą zawierać nazwane symbole zastępcze, które są interpolowane przy użyciu argumentów słów kluczowych do format .

Korzystanie ze słownika (Python 2.x)

>>> data = {'first': 'Hodor', 'last': 'Hodor!'}
>>> '{first} {last}'.format(**data)
'Hodor Hodor!'

Korzystanie ze słownika (Python 3.2+)

>>> '{first} {last}'.format_map(data)
'Hodor Hodor!'

str.format_map pozwala korzystać ze słowników bez konieczności ich wcześniejszego rozpakowywania. Zamiast nowo wypełnionego dict używana jest również klasa data (która może być typem niestandardowym).

Bez słownika:

>>> '{first} {last}'.format(first='Hodor', last='Hodor!')
'Hodor Hodor!'


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow