Leere Zellen mit '0' belegen

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
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Mittwoch 15. August 2007, 09:25

Hallo an alle,
ich moechte gern aus einer Datei (in Form einer Tabelle) die leeren Zellen mit '0' belegen.

Folgendes habe ich mir uebrlegt:

Code: Alles auswählen

inp = open('Suppl_Table_1.txt')
out = open('Suppl_Table_1_out1.txt','w')

for line in inp.readlines():
    column = line.split()

    if column[2] == ' ':
        column[2] = '0'
    if column[3] == ' ':
        column[3] = '0'
    if column[4] == ' ':
        column[4] = '0'
    if column[5] == ' ':
        column[5] = '0'
    if column[6] == ' ':
        column[6] = '0'
    if column[7] == ' ':
        column[7] = '0'
    if column[8] == ' ':
        column[8] = '0'
    if column[9] == ' ':
        column[9] = '0'
    if column[10] == ' ':
        column[10] = '0'

    out_line = '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' % (column[0],column[1],
                                                                     column[2],column[3],
                                                                     column[4],column[5],
                                                                     column[6],column[7],
                                                                     column[8],column[9],
                                                                     column[10])
    out.write(out_line)

inp.close()
out.close()
Nun erhalte ich leider folgende Fehlermeldung, die ich nicht verstehe:
Traceback (most recent call last):
File "/home/cellnet/claudiak/bei/Analyse/NA_fuer_alle_leeren_Zellen.py", line 15, in <module>
if column[6] == ' ':
IndexError: list index out of range
Wie ist ein leerer String definiert, doch schon so, oder?
leerer String = ' ' (Hochkomma Leerzeichen Hochkomma)

Kann mir jemand weiter helfen?
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Mittwoch 15. August 2007, 10:05

Erstmal ein Tipp: der Code schreit förmlich nach ordentlichen Schleifen. (Copy&Paste-Code ist nicht schön) ;)
2. Durch dein Split() werden alle leerzeichen " " entfernt... das ist für split defaultmäßig der Delimiter mit dem gesplittet wird.
Mach mal ein print column, das hilf bestimmt.
BlackJack

Mittwoch 15. August 2007, 10:14

Die Meldung sagt, das es den Listenindex nicht gibt. Wenn man sich die Zeile anschaut, bei der die Ausnahme auftritt, scheint es eine Zeile zu geben die keine 7. Spalte (Zählung beginnt ja bei 0) besitzt. Das Problem liegt also in den Daten.

Anführungszeichen, Leerzeichen, Anführungszeichen ist keine leere Zeichenkette. Sie enthält doch ein Leerzeichen. Es ist ein Unterschied ob man ein Leerzeichen hat, oder wirklich gar kein Zeichen zwischen den beiden Anführungszeichen.

Anmerkungen zum Quelltext: Dateiobjekte sind selbst schon "iterable", das heisst man kann `inp` direkt in der ``for``-Schleife benutzen. Das hat gegenüber von `readlines()` den Vorteil, dass nicht die ganze Datei auf einmal in den Speicher geladen werden muss.

Bei so vielen gleichartigen Zeilen bietet sich eine Schleife die über die Indexe 2 bis 10 geht förmlich an um Tipparbeit zu sparen. Und das zusammensetzen ist mit `str.join()` auch einfacher zu haben.

Code: Alles auswählen

def main():
    inp = open('Suppl_Table_1.txt')
    out = open('Suppl_Table_1_out1.txt','w')
    
    for line in inp:
        columns = line.split('\t')
        for i in xrange(2, 11):
            if columns[i] == '':
                columns[i] = '0'
        out.write('\t'.join(columns))
    
    inp.close()
    out.close()
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Mittwoch 15. August 2007, 13:14

Vielen Dank fuer die Hilfe bisher.

Meine Datei besteht aus 11 Spalten getrennt durch Tabulator. Nun mach ich split('\t') trenne also zeilenweise den String am Tabulator auf. Warum kommt dann trotzdem noch die gleiche Fehlermeldung (list index out of range) an einer Stelle, wo eine leere Zelle ist???
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mittwoch 15. August 2007, 14:42

Hoi,
Warum kommt dann trotzdem noch die gleiche Fehlermeldung (list index out of range) an einer Stelle, wo eine leere Zelle ist???
Wahrscheinlich weil Deine Annahme nicht stimmt.

Wenn ich wieder mal irgendein obskures Fileformat lesen muß, dann mache ich solche Fehler auch immer wieder mal. Zap hat schon einen guten Tipp gegeben, als er meinte
Zap hat geschrieben:Mach mal ein print column, das hilf bestimmt.
.
Die Frage ist doch, ob Du dann genau vor dem Traceback tatsächlich eine Zeile erhälst, die genau 11 mal ['', '', '', '', '', ... ''] enhält. Nein? Hat dann wirklich jede Zeile der einzulesenden Datei 11 Tabs?

Gruß,
Christian
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Mittwoch 15. August 2007, 14:54

Bei einem print column habe ich festgestellt, dass es mir fuer jede Zeile eine Liste ausgiebt, in der die leeren Zellen nicht mit enthalten sind, also ist die Fehlermeldung berechtigt, da dann natuerlich manchmal weniger Eintraege als 11 enthalten sind.

Aber was nun?
Wie kann ich jetzt die leeren Zellen mit null befuellen, wenn sie gar nicht wirklich existieren?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Mittwoch 15. August 2007, 15:28

Hast du auch richtig gesplittet? Hier mal ein paar Versuche:

Code: Alles auswählen

s = "1\t2\t \t3"

In [2]: s.split()
Out[2]: ['1', '2', '3']

In [3]: s.split("\t")
Out[3]: ['1', '2', ' ', '3']

In [4]: t =  "1\t2\t\t3"

In [5]: t.split()
Out[5]: ['1', '2', '3']

In [6]: t.split("\t")
Out[6]: ['1', '2', '', '3']
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Mittwoch 15. August 2007, 19:28

Ungetestet:

Code: Alles auswählen

for line in inp:
    column = line.split()
    for i,col in column[2:]:
        if col == ' ':
            column[i] = '0'
    out.write("\t".join(column) + "\n")
BlackJack

Mittwoch 15. August 2007, 19:38

Da fehlt ein `enumerate()` und es hat das Problem mit `split()` ohne Argumente, was leere Einträge einfach verschluckt statt sie zurück zu liefern.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 16. August 2007, 08:56

silky vanilla hat geschrieben: Aber was nun?
Wie kann ich jetzt die leeren Zellen mit null befuellen, wenn sie gar nicht wirklich existieren?
Was willst Du denn eigentlich machen? Wenn Deine Annahme richtig ist, daß mit \t getrennt wird und nur wenn Spalten unbesetzt sind die \ts fehlen, dann kannst Du auch einfach die fehlende Anzahl (11 - len(column)) mit Nullen ergänzen. Mußt nur die Beispiele etwas umschreiben.

Gruß,
Christian
Antworten