Problem mit Tabellenformatierung (2D Liste)

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
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hallo Leute!

Ich hab folgendes Problem:

Ich will Daten aus einer Inputdatei einlesen und austauschen.

Die Inputdatei sieht so aus:

<data1> <data2> <data3> <data4>

Die Abstände sind variabel zwischen den Überschriften. Das heisst, die Anzahl der zwischenliegenden Leerzeichen variiert.

In einer Liste habe ich die Werte von den Stellen an welchen "<" vorkommt. Unter jedem "<" sollen die Werte einer 2D Liste kommen.

Code: Alles auswählen

stellen_list=[0,12,20,34]

2d_list=[['11111','11111','11111','/n'],['2222','22222','2222','/n'],['3333','33333','33333','/n'],['44444','44444','44444','/n']]
Ich möchte nun, dass die 2d_list so angepasst wird, dass die Werte beim Ausgeben in ein File (die Datenüberschrift bleibt bestehen) immer genau unter unter den '<' stehen.

Ich weiß, dass ich mich ein wenig kompliziert ausgedrückt habe.
Wär mir eine super Freude, wenn mir wer helfen könnte.

Danke.

Johannes
Benutzeravatar
knekke
User
Beiträge: 100
Registriert: Freitag 29. Oktober 2004, 17:23
Wohnort: Schweden

Hier ist mal ein ganz ganz grober Ansatz. Die längen der Strings in 'werte' sind auch noch nicht berücksichtigt, und es lässt sich auch bestimmt irgendwie in eine Schleife basteln, aber dafür ist es dann doch nur zu sehr Hobby, als dass ich das so auf die schnelle könnte :wink:

Code: Alles auswählen

stellen=[0,12,20,34]
werte=[['11111','11111','11111','/n'],['2222','22222','2222','/n'],['3333','33333','33333','/n'],['44444','44444','44444','/n']]

pos1 = stellen[0]*' '
pos2 = (stellen[1]-stellen[0])*' '
pos3 = (stellen[2]-stellen[1]-stellen[0])*' '
pos4 = (stellen[3]-stellen[2]-stellen[1]-stellen[0])*' '

print pos1+werte[0][0]+pos2+werte[1][0]+pos3+werte[2][0]+pos4+werte[3][0]
print pos1+werte[0][1]+pos2+werte[1][1]+pos3+werte[2][1]+pos4+werte[3][1]
print pos1+werte[0][2]+pos2+werte[1][2]+pos3+werte[2][2]+pos4+werte[3][2]
BlackJack

Du könntest Dir eine passenden Formatierungszeichenkette basteln (lassen):

Code: Alles auswählen

columns = [0, 12, 20, 34]
data = [['11111', '11111', '11111', '/n'],
        ['2222', '22222', '2222', '/n'],
        ['3333', '33333', '33333', '/n'],
        ['44444', '44444', '44444', '/n']]

format = ''.join('%%-%ds' % (end - start)
                 for start, end in zip(columns, columns[1:])) + '%s'
for row in data:
    print format % tuple(row)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@keboo: Kennst du %30s bzw. %-30s ?

Hier ein Beispiel:

Code: Alles auswählen

o = ""
for i in xrange(10):
    o += "X"
    print "|%30s|" % o

o = ""
for i in xrange(10):
    o += "X"
    print "|%-30s|" % o
Ausgabe:

Code: Alles auswählen

|                             X|
|                            XX|
|                           XXX|
|                          XXXX|
|                         XXXXX|
|                        XXXXXX|
|                       XXXXXXX|
|                      XXXXXXXX|
|                     XXXXXXXXX|
|                    XXXXXXXXXX|
|X                             |
|XX                            |
|XXX                           |
|XXXX                          |
|XXXXX                         |
|XXXXXX                        |
|XXXXXXX                       |
|XXXXXXXX                      |
|XXXXXXXXX                     |
|XXXXXXXXXX                    |

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

hallo leute!

@ blackjack:

Ich hab das Problem, dass manchmal in columns der erste Wert größer ist als 0. Es sollen vor dem ersten Wert die Anzahl an Leerzeichen entsprechend dem ersten Wert in columns hinzugefügt werden. Wie kann ich das machen?

@ jens:

ich kenne das noch nicht. wie kann ich das in meinem Fall verwenden?
als neuling ist mir das leider ein wenig zu abstrakt. wäre super wenn du mir einen hinweis geben könntest.

danke an euch,

johannes
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

habs gelöst, danke!

johannes
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

keboo hat geschrieben:habs gelöst, danke!
Dann schreib auch wie.

Vielleicht hat jemand später genau dasselbe Problem und findet diesen Thread mit der Forumssuche.
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hallo!

Habs mit einer leichten Anpassung von Black Jacks Code gelöst.
Danke nochmals dafür. Und danke dafür, dass du mich auf eine neue Art der Stringverarbeitung gebracht hast.

Hab an der jeweils ersten Stelle von data die erste stelle von columns * leerzeichen eingefügt.

Das wars.

Danke.
johannes
Antworten