Seite 1 von 1

Leere Zellen mit '0' belegen

Verfasst: Mittwoch 15. August 2007, 09:25
von silky vanilla
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?

Verfasst: Mittwoch 15. August 2007, 10:05
von Zap
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.

Verfasst: Mittwoch 15. August 2007, 10:14
von BlackJack
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()

Verfasst: Mittwoch 15. August 2007, 13:14
von silky vanilla
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???

Verfasst: Mittwoch 15. August 2007, 14:42
von CM
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

Verfasst: Mittwoch 15. August 2007, 14:54
von silky vanilla
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?

Verfasst: Mittwoch 15. August 2007, 15:28
von Rebecca
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']

Verfasst: Mittwoch 15. August 2007, 19:28
von Joghurt
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")

Verfasst: Mittwoch 15. August 2007, 19:38
von BlackJack
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.

Verfasst: Donnerstag 16. August 2007, 08:56
von CM
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