Frage zur Listenverarbeitung

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.
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Frage zur Listenverarbeitung

Beitragvon Mawilo » Donnerstag 23. September 2004, 13:16

Hallo zusammen,

ich lese eine csv-Datei aus und muss einzelne Listenelemente ersetzen.

Code: Alles auswählen

for line in f:
    line.replace(' ','')
    z = line.split(';')
    z[12].replace('1','ZV')\
        .replace('2','R')\
        .replace('4','ZB')\
        .replace('5','BR')\
        .replace('6','SO')\
        .replace('14','ZV')
    print z


warum bekomme ich folgende Fehlermeldung?: :oops:

Code: Alles auswählen

z[12].replace('1','ZV')\
IndexError: list index out of range


Stephan
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 23. September 2004, 13:29

Hi Stephan,

hat z nach dem split wirklich 13 Elemente?
Im übrigen hast Du da noch einen Fehler drinnen, erst wird "1" durch "ZV" ersetzt und dann wird versucht "14" durch "ZV" zu ersetzen was aber nicht gehen wird, da ja 1 schon durch ZV ersetzt wurde.


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
joe

Re: Frage zur Listenverarbeitung

Beitragvon joe » Donnerstag 23. September 2004, 13:29

Hi!
Stephan hat geschrieben:warum bekomme ich folgende Fehlermeldung?: :oops:

Code: Alles auswählen

z[12].replace('1','ZV')\
IndexError: list index out of range
Weil z offensichtlich keine 13 elemente enthält. Ist die letzte zeile in der datei vielleicht eine leerzeile?
joe
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Donnerstag 23. September 2004, 13:55

Hallo Dookie, Hallo Joe,

ich habe in der csv-Datei 41 Zeilen und es sind keine Leerzeilen enthalten.
Jede Zeile hat 37 Elemente. Da sind aber auch ne Menge leere dabei. das sollte aber kein Problem sein, da alle Elemente in csv durch ";" getrennt sind. Das 13. Element ist meistens leer.

In der Ausgabe von

Code: Alles auswählen

print z[12]
wird eine Leerzeile zugefügt und es wird nichts ersetzt. :?

Code: Alles auswählen

Liste ok
6
1
5
4
4
4
4
2
1
5
4
2

6
1
5
4
2




Stephan
joe

Beitragvon joe » Donnerstag 23. September 2004, 14:24

Hallo!
Stephan hat geschrieben:In der Ausgabe von

Code: Alles auswählen

print z[12]
wird eine Leerzeile zugefügt und es wird nichts ersetzt. :?

z[12] ist (wenn vorhanden) ja ein string und strings sind unveränderlich, d.h. daß replace() das string-objekt nicht direkt ändern kann, sondern den veränderten string als neues objekt zurückgibt: z[12] = z[12].replace('1','ZV')
joe
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 23. September 2004, 14:33

und sehe ich das richtig? enthält z[12] wenn überhaupt was enthalten ist eh immer eine Zahl, dann könnte man das ganze auch mit einem Dictionary lösen:

Code: Alles auswählen

replacer12 = {"1" : "ZV",
              "2" : "R",
              "4" : "ZB",
              "5" : "BR",
              "6" : "SO",
              "14" : "ZV"}

for line in f:
    line.replace(' ','')
    z = line.split(';')
    z[12] = replacer12.get(z[12], z[12])
    print z


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Donnerstag 23. September 2004, 14:42

Danke für die Hilfe. Ich werde das mit dem Dic mal probieren.
Was ich nicht verstehe ist, dass folgendes einen fehler erzeugt:

Code: Alles auswählen

for line in f:
    b = b + 1
    line.replace(' ','')
    z = line.split(';')
    print 'Zeile: %s'%b
    print z[12]

Fehler:

Code: Alles auswählen

print z[12]
IndexError: list index out of range


aber folgendes funktioniert:

Code: Alles auswählen

for line in f:
    b = b + 1
    line.replace(' ','')
    z = line.split(';')
    print 'Zeile: %s'%b
    print z[12:13]
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 23. September 2004, 14:46

mach mal:

Code: Alles auswählen

for line in f:
    b = b + 1
    line.replace(' ','')
    z = line.split(';')
    print 'Zeile: %i Eintraege: %i' % (b, len(z))
    print z
    print z[12]



Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Donnerstag 23. September 2004, 15:03

... da liegt der Hase im Pfeffer

In der csv-Datei werden verschiedene Zeilen (die sehr lang sind) gebrochen (mit "\n"). Dadurch ist dann eine Zeile nur 11 Elemente lang (da es nur der Rest der vorhergehenden Zeile ist).

Ist natürlich ziemlich doof von Excel. :o

Kann ich schon beim Einlesen die Zeilen reduzieren? ich benötige nur Informationen aus den ersten 26 Spalten.

Stephan
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 23. September 2004, 15:39

Code: Alles auswählen

for line in f:
    z = line.replace(" ","").split(";", 26)
    ...


Gruß

Dookie

Code: Alles auswählen

#!/usr/bin/env python
import this
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Donnerstag 23. September 2004, 16:00

Danke - ich sehe langsam Licht am Ende des Tunnels :wink:

Stephan
joe

Beitragvon joe » Donnerstag 23. September 2004, 16:00

Hallo!
Dookie hat geschrieben:

Code: Alles auswählen

for line in f:
    z = line.replace(" ","").split(";", 26)
    ...

Das hilft ihm nicht viel, denn das verhindert ja nicht die auswertung der zeilen mit nur elf werten, die ja eigentlich nur der rest der vorherigen zeile sind. Ich würd eher diese zeilen überspringen (wenn sicher ist, daß diese "rest"-zeilen selbst nie 26 oder mehr werte enthalten können):

Code: Alles auswählen

for line in f:
    ...
    z = line.split(';')
    if len(z) < 26: continue
    ...

Das wäre mir aber alles zu unsicher. Ich würde eher das übel an der wurzel zu packen versuchen. Ich kann hier zumindest problemlos gigantische exceltabellen als csv-dateien exportieren, ohne daß irgendwelche zeilenumbrüche entstehen. Kann das problem nicht irgendwo zwischen dem excel-export und dem python-script entstanden sein? Emailprogramme z.B. versehen versandte textdateien gerne mit zusätzlichen umbrüchen.
Falls du, Stephan, auf die exceltabelle einfluß hast, könntest du auch jede zeile in z.B. eckige klammern einschließen. Dann kannst du im python-script klar identifizieren, was zu einer datenzeile gehört.
joe
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Donnerstag 23. September 2004, 16:24

Hallo Joe,

das Problem muss schon in Excel sein, denn wenn ich die csv-Datei mit WordPad oder einem anderen Texteditor öffne, habe ich Zeilenumbrüche. Nur wenn ich die Datei mit NotePad öffne, sind die Zeilen komplett.

Python liest die Zeilen wie WordPad ein.

Stephan
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Beitragvon Milan » Donnerstag 23. September 2004, 16:48

Frage: warum verwendest du nicht das Standartdistrimodul csv? Das lässt sich auch so konfigurieren, dass du mit ";" als Seperator arbeiten kannst. Du spaarst dir damit bestimmt eine Menge Arbeit :wink: ...
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Donnerstag 23. September 2004, 18:02

Code: Alles auswählen

#!/usr/bin/env python
import this

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]