Hoe kan ik een string met vaste breedte links uitlijnen?

Ik wil alleen tekstkolommen met een vaste breedte, maar de tekenreeksen zijn allemaal rechts opgevuld in plaats van links!!?

sys.stdout.write("%6s %50s %25s\n" % (code, name, industry))

produceert

BGA                                BEGA CHEESE LIMITED   Food Beverage & Tobacco
BHP                               BHP BILLITON LIMITED                 Materials
BGL                               BIGAIR GROUP LIMITED Telecommunication Services
BGG           BLACKGOLD INTERNATIONAL HOLDINGS LIMITED                    Energy

maar we willen

BGA                                BEGA CHEESE LIMITED   Food Beverage & Tobacco
BHP                               BHP BILLITON LIMITED                 Materials
BGL                               BIGAIR GROUP LIMITED Telecommunication Services
BGG           BLACKGOLD INTERNATIONAL HOLDINGS LIMITED                    Energy

Antwoord 1, autoriteit 100%

U kunt de vereiste grootte voorafgaan met -om links uit te vullen:

sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))

Antwoord 2, autoriteit 39%

Deze versie gebruikt de str.formatmethode.

Python 2.7 en nieuwer

sys.stdout.write("{:<7}{:<51}{:<25}\n".format(code, name, industry))

Python 2.6-versie

sys.stdout.write("{0:<7}{1:<51}{2:<25}\n".format(code, name, industry))

UPDATE

Eerder stond er een verklaring in de documenten dat de %-operator in de toekomst uit de taal zou worden verwijderd. Deze verklaring is verwijderd uit de documenten.


Antwoord 3, autoriteit 23%

sys.stdout.write("%-6s %-50s %-25s\n" % (code, name, industry))

terzijde: je kunt de breedte variabel maken met *-s

>>> d = "%-*s%-*s"%(25,"apple",30,"something")
>>> d
'apple                    something                     '

Antwoord 4, autoriteit 18%

Ik geef absoluut meer de voorkeur aan de format-methode, omdat deze zeer flexibel is en gemakkelijk kan worden uitgebreid naar uw aangepaste klassen door __format__of de strof reprrepresentaties. Om het simpel te houden, gebruik ik printin de volgende voorbeelden, die kan worden vervangen door sys.stdout.write.

Eenvoudige voorbeelden:uitlijning / opvulling

#Justify / ALign (left, mid, right)
print("{0:<10}".format("Guido"))    # 'Guido     '
print("{0:>10}".format("Guido"))    # '     Guido'
print("{0:^10}".format("Guido"))    # '  Guido   '

We kunnen naast de alignspecificeert die ^, <en >een vulling zijn teken om de spatie te vervangen door een ander teken

print("{0:.^10}".format("Guido"))    #..Guido...

Voorbeelden van meerdere invoer:veel invoer op één lijn brengen en vullen

print("{0:.<20} {1:.>20} {2:.^20} ".format("Product", "Price", "Sum"))
#'Product............. ...............Price ........Sum.........'

Geavanceerde voorbeelden

Als u uw aangepaste klassen heeft, kunt u de str– of repr-representaties als volgt definiëren:

class foo(object):
    def __str__(self):
        return "...::4::.."
    def __repr__(self):
        return "...::12::.."

Nu kun je de !s(str) of !r(repr) gebruiken om python te vertellen die gedefinieerde methoden aan te roepen. Als er niets is gedefinieerd, wordt Python standaard ingesteld op __format__, wat ook kan worden overschreven.
x = foo()

print "{0!r:<10}".format(x)    #'...::12::..'
print "{0!s:<10}".format(x)    #'...::4::..'

Bron: Python Essential Reference, David M. Beazley, 4e editie


Antwoord 5, autoriteit 17%

Met de nieuwe en populaire f-stringsin Python 3.6, kunnen we een string met een opvullengte van 16 als volgt links uitlijnen:

string = "Stack Overflow"
print(f"{string:<16}..")
Stack Overflow  ..

Als je een variabele opvullengte hebt:

k = 20
print(f"{string:<{k}}..")
Stack Overflow      .. 

f-snarenzijn compacter.


Antwoord 6, autoriteit 7%

Gebruik -50%in plaats van +50%Ze worden links uitgelijnd..


Antwoord 7, autoriteit 5%

Een iets beter leesbare alternatieve oplossing:
sys.stdout.write(code.ljust(5) + name.ljust(20) + industry)

Merk op dat ljust(#ofchars)tekens met een vaste breedte gebruikt en niet dynamisch wordt aangepast zoals de andere oplossingen.

(Houd er rekening mee dat het toevoegen van strings met +aanzienlijk sneller is in moderne Python dan in het verleden, maar je kunt +verwisselen met ''.join(...)als je uit gewoonte nog steeds de voorkeur geeft aan die methode)


Antwoord 8, autoriteit 3%

Deze werkte in mijn python-script:

print "\t%-5s %-10s %-10s %-10s %-10s %-10s %-20s"  % (thread[0],thread[1],thread[2],thread[3],thread[4],thread[5],thread[6])

Other episodes