Tach!
Auch du hast kein mehrdimensionales Array im eigentlichen Sinne vorliegen. Verdeutliche dir stattdessen die wirkliche Struktur (notfalls mit print_r() oder var_dump()).
$data = array();
$data ist nun ein leeres PHP-Array, was später alle möglichen Strukturen aufnehmen kann. (Siehe einleitender Absatz zu Arrays.)
$data[$i]['ea'] = trim(str_replace(".","",$datarr[0]));
Nun legst du mit selbst vergebenem Schlüssel etwas in dieses Array. Die Schlüssel sind numerisch und fortlaufend, also hast du das, was man eine Liste nennt. Das Selbst-Verwalten von $i ist aber gar nicht notwendig, wenn du die als Wert in jedem Listeneintrag abzulegende Struktur zuerst erstellst und sie dann komplett $data[] = zuweist. Dann könntest du auch viel besser sehen, dass du da zunächst ein Array (in diesem Fall ein Dictionary) anlegst. Das explizite Initialisieren dieses Arrays hast du aber unterlassen. Stattdessen vertraust du PHPs Mechanismus, alles anzulegen, was du schreibend verwendest. Diesen Mechanismus verwendest du auch beim erstmaligen Ansprechen von $data[$i].
data = []
data[i]['ea'] = line.split(";")[0].replace(".", "").strip()
Der PHP-Weg funktioniert aber so nicht in Python (zumindest nicht für Listen, wohl aber für Dictionarys). Die Initialisierung einer Liste ist richtig. Aber das Anfügen von Elementen geht nicht durch einfaches Verwenden von (noch) nicht vorhandenen Index-Werten, sondern mit einer Methode oder einem List Operator. ("Dive Into Python" ist auch ein nicht zu verachtendes Python-Buch. Für dein Problem: das Lists-Kapitel.)
IndexError: list index out of range
Du greifst auf einen Index zu, der nicht im Array vorhanden ist. - Nebenbei: Anders als bei PHP kann eine Python-Liste auch keine Lücken im Index aufweisen, weil die Index-Werte echte Postionsnummern sind und nicht einfach nur ein Key mit numerischem Inhalt.
data[i]['ea'] = line.split(";")[0].replace(".", "").strip()
data[i]['okz'] = line.split(";")[1].replace(".", "").strip()
data[i]['k'] = line.split(";")[2].replace(".", "").strip()
data[i]['v'] = line.split(";")[3].replace(".", "").strip()
Ich würde hier nur einmal splitten sowie die Punkte vorher entfernen und nicht jedes Mal extra (es sei denn, du hast Felder, in denen sie drin bleiben sollen).
dedlfix.