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 str
of repr
representaties. Om het simpel te houden, gebruik ik print
in 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 align
specificeert 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])