Tabellen Formatierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Gast

Donnerstag 27. Januar 2005, 16:08

Hallo,
ich bin relativ neu in Python.
Ich versuche gerade Ergebnisse in einer Art Tabelle zusammenfassend in ein File zu schreiben.
Also die Tabelle sollte 6 Spalten haben.
Etwa so:
Status Parameter Value1 Value2 line1 line2

Mein Problem ist dass Formatierungszeichen wie "%10s" % parameter
leider zu verschobenen einträgen führen da ja die Parameter und die Werte unterschiedlich lang sind...

Kann mir jemand helfen wie ich das einfachheit halber realisieren kann? Ich wünschte es ginge so dass exakt unter dem Buchstaben P von Parameter die ganzen Parameter Namen anfangen...und auch unter V von Value1 die Werte dann anfangen..

Danke euch
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 27. Januar 2005, 16:46

Du kannst dir ja Funktionen schreiben, die die einzelnen Strings "ausdehnen", indem sie Whitespaces einfügen. Das wäre eine Möglichkeit. Eine andere wäre die Nutzung von Tabs.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Donnerstag 27. Januar 2005, 16:47

Spontan fällt mir ein, den längsten wert einer Spalte suchen, und die anderen werte dieser Spalte mit hilfe von string.rjust() auf diese Länge mit Leerzeichen erweitern.

MfG
Andreas
XT@ngel
User
Beiträge: 256
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Donnerstag 27. Januar 2005, 17:01

hier mal eine fünf Minuten Lösung:

Code: Alles auswählen

Spalte_1 = ["Status", "843854054950", "3473439438"]

def Find_maxLaenge(Spalte):
    max_laenge = 0
    for Wert in Spalte:
        laenge = len(Wert)
        if laenge > max_laenge:
            max_laenge = laenge
    return max_laenge

just = Find_maxLaenge(Spalte_1)
for Value in Spalte_1:
    print Value.ljust(just) + "|"
mfG
Andreas
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 27. Januar 2005, 17:02

Hi,

wohl eher str.ljust(n)

Du kannst aber auch bei der Stringformatierung mit % einfach einen Negativen Wert nehmen, dann wird der String linksbündig ausgegeben

Code: Alles auswählen

text1 = "Hallo"
text2 = "Welt"
fmt = "%-20s%-20s[ENDE]"
print fmt % (text1, text2)
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
BlackJack

Donnerstag 27. Januar 2005, 17:35

Finden der maximalen Länge etwas kürzer:

Code: Alles auswählen

def find_max_length(iterable):
    return reduce(max, map(len, iterable), 0)
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 27. Januar 2005, 18:20

oder mit LC statt map:

Code: Alles auswählen

def find_max(iteralble):
    return max([len(x) for x in iterable])
keine Chance für den max sich noch zu verstecken ;)

@BlackJack: das reduce brauchts ned, max sucht aus einer beliebigen Reihe das Maximum raus, nicht nur aus einem Paar.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Gast

Freitag 28. Januar 2005, 20:19

Ja Öha...
ein mal wech und dann schon so viel Hilfe....Danke euch allen. Werd mich gleich mal ransetzen und schauen das ichs hinformatier ;o)

Danke
BlackJack

Montag 31. Januar 2005, 13:12

Dookie hat geschrieben:@BlackJack: das reduce brauchts ned, max sucht aus einer beliebigen Reihe das Maximum raus, nicht nur aus einem Paar.
Fast beliebige Sequenz -- diese hier funktioniert nicht: []. Bei dem reduce() hatte ich als Anfangswert deshalb eine 0 angegeben.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 31. Januar 2005, 13:35

[] hat aber auch kein Maximum, auch nicht 0. Ausserdem wird bei reduce für jedes Element der Liste max aufgerufen während ohne reduce das ganze innerhalb der max-Funktion läuft. Was sicher um einiges performanter ist.
Ich würd halt vor dem Aufruf von find_max testen ob iterable leer ist oder das ganze in einen try: ... except ValueError: ... Block einschließen.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Antworten