print variable Länge in Python3

OP #7135966
Lesenswert?

Hallo Forum,

ich sitze schon eine Weile über dem folgendem Python3 Problem.

Ich habe eine Output den ich lese mit Zeilen unterschiedlicher Länge.

Bei diesen bestimme ich die längste Zeile und möchte
alle weiteren Zeilen mit gleicher maximaler Länge mittels der
print-Anweisung ausgeben.

z.B. print("Ausgabe: |{0}|".format(zeile[i],maxlaenge))

Erhalten möchte ich die folgende Ausgabe:
1
Ausgabe: |Zeile1                |
2
Ausgabe: |Z....eile2            |
3
Ausgabe: |Z.........eile3       |
4
Ausgabe: |Zeile4 mit max. Laenge|

Bei 'C' würde ich printf("%10sn\",zeile[i]); schreiben,
wobei die '10' statisch ist. Ich brauche es aber dynamisch.

Habe leider trotz Suche auf den Python Seiten und auch bei
stackoverflow nichts passendes gefunden, oder es übersehen.

Habt Ihr was passendes für mich.

Danke schon mal für die Mühe.

Markus
OP #7136020
Lesenswert?

Hallo Zusammen,

das ging ja schnell - super.

Danke allen Beteiligten für den Input.

Letztendlich habe ich mich für die Variante von MaWin entschieden
1
ordlenmax=0
2
for i in range (1, int(lcs)+1):
3
    if len(p.tables[0][i][1]) > ordlenmax:
4
        ordlenmax=len(p.tables[0][i][1])
5

6
fmt="| %-" + str(ordlenmax) + "s "
7
for i in range (1, int(lcs)+1):
8
    print("{0:8}".format(p.tables[0][i][0]),end =" ")
9
    print(fmt % p.tables[0][i][1],end=" ")
10
    print("| {0:10}".format(p.tables[0][i][2]),end =" ")
11
    print("| {0:30}".format(p.tables[0][i][3]),end =" ")
12
    print("| {0:10}".format(p.tables[0][i][4]),end =" ")
13
    print("| {0:20}".format(p.tables[0][i][6]),end =" ")
14
    print()

Output nun wie gewünscht.

Lieben Dank an alle ;-)

PS.: Die Variante von Norbert gefällt mir auch ganz gut!
OP #7136077
Lesenswert?

Danke Norbert für den Hinweis.

Es wird sicherlich ein längeres Intermezzo aber dafür muss
ich mich erst fit machen, wie man sieht.
Bis dato habe ich meine Skripting Intermezzi in Perl praktiziert.
Nun ändert sich das bei uns in der Arbeit und Python gewinnt bei
mir immer mehr an Bedeutung, auch bedingt durch die ganzen Cloud
Deploment Tools wie z.B. bei ansible.

Danke nochmals.

Markus
Moderator #7136129
Lesenswert?

Etwas unschön ist, dass du hier alte (mit %) und neue Formatierung
(mit {} und format()) mischst:

Markus W. schrieb:
> fmt="| %-" + str(ordlenmax) + "s "
> for i in range (1, int(lcs)+1):
>     print("{0:8}".format(p.tables[0][i][0]),end =" ")

Alles mit neuer Formatierung und etwas pythonischer:
1
#!/usr/bin/python3
2
table = p.tables[0][1:]
3
maxlen = max(len(line[1]) for line in table)
4
for line in table:
5
  print('{0:8} | {1:{w}}  | {2:10} | {3:30} | {4:10} | {6:20}'.format(*line, w=maxlen))

Ich bin dabei davon ausgegangen, dass lcs die Anzahl der Zeilen der
Tabelle ohne die Kopfzeile ist. Sollte dies nicht der Fall sein, müsste
der Code noch leicht angepasst werden.
OP #7136138
Lesenswert?

@Yalu X.

danke für Deine Mühe und Berichtigung.
Wie schon erwähnt ist bei mir Python noch nicht sehr gefestigt.
Habe zwar schon einige Kurse besucht, muss aber noch an den Details
arbeiten. Der Wandel zwischen Py2 und Py3 macht die Sache auch
nicht unbedingt leichter, aber ich hoffe dass es mit der Zeit
reift und von mir verinnerlicht wird.
Je mehr man damit macht, desto mehr bleibt hoffentlich hängen.
Die C-ähnlichen Formatierungen sind am Anfang halt vertrauter.
Und über das Mischen der Formate habe ich auch noch nicht so richtig
nachgedacht. Danke, dass Du mich darauf aufmerksam gemacht hast.

LG
Markus
Moderator #7136392
Lesenswert?

Markus W. schrieb:
> Die C-ähnlichen Formatierungen sind am Anfang halt vertrauter.

Ja, das geht mir ganz ähnlich. Die C-Formatsyntax kenne ich auswendig,
bei der {}-Syntax in Python muss ich die etwas seltener genutzten
Features öfter mal nachschlagen.

Man kann übrigens in C im Formatstring eine variable Feldbreite mit '*'
angeben und den Zahlenwert als Argument übergeben:
1
char text[] = "abc";
2
int width = 5;
3
printf("|%-*s|\n", width, text);

Das geht ganz ähnlich auch in Python:
1
#!/usr/bin/python
2
text = 'abc'
3
width = 5
4
print('|%-*s|' % (width, text))

Ausgabe in beiden Fällen:
1
|abc  |
OP #7136582
Lesenswert?

@Yalu X.
and the others,

ich habe mir mal alle Varianten in meine
Python3-Knowled-Base-Doku archiviert, um
wieder bei Bedarf darauf zugreifen zu können.
1
Leider ist der Output zu lang um ihn in den code Tag einzubetten.
2
Also habe ich ihn als Anhang dran gehängt. (DOS und UNIX Variante)
3
Oder wisst Ihr eine bessere Methode - z.B. Fenster mit horiz. Scroll-Balken

Markus
Angehängte Dateien:
OP #7136602
Lesenswert?

Noch zum Abschluß

Mein Testskript habe ich auch mal angehängt.
Es liest eine html GUI Seite ein und stellt sie
textlich dar.

Mit Eurem Input konnte ich die Länge und die
Formatierungs Blöcke deutlich verkürzen und
die Ausgabe ansehnlicher machen.

Jetzt will ich noch einige Bereiche zu Unterfunktionen
zusammenfassen und das Ganze in einem main-Block
kapseln mit

if _name_ == '__main__':

und Co.

Danke nochmals für Eure Assistenz|Hilfe :-)

Markus
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren