@marcel665: Ein paar mehr Leerzeichen täten der Lesbarkeit gut. Um Binäre Operatoren und nach Kommas beispielsweise.
Namen werden in Python per klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
Die Funktion `open_file()` macht deutlich mehr als nur eine Datei zu öffnen, der Name passt also nicht so ganz.
Wo möglich sollte man Dateien zusammen mit der ``with``-Anweisung verwenden und bei Textdatein immer eine explizite Kodierung angeben.
`base` ist ungewöhnlich weil man da ”magische” Indexwerte für die einzelnen Buchstaben hat. An der Stelle würde man eher ein Wörterbuch verwenden das die Buchstaben auf Anzahlen abbildet. Hier dann auch gleich eine spezialisiertere Ableitung: `collections.Counter()`.
Der Compiler hat kein Problem mit dem Quelltext, den kümmert das nicht ob zur Laufzeit vielleicht eine `IndexError` auftreten wird. Und wo ganz sicher ein Problem auftreten wird ist nicht eine Zeichenkette sondern beim Versuch mit dem Index `i` auf `possible_startCodons` zuzugreifen. Das ist eine leere Liste, es gibt keinen einzelnen Index bei dem *kein* `IndexError` ausgelöst werden würde. Elemente fangen das nicht einfach an zu existieren weil man an einem Index etwas zuweist. Da muss bereits etwas existieren was man neu zuweisen kann. Da würden sich sonst nämlich so fragen stellen was denn mit Indexpositionen passieren soll bei einer Zuweisung die vor dem Index liegen den man zuweist und an die vorher noch nichts zugewiesen wurde.
Dieser Fall kann in Deinem Code ja durchaus auftreten weil die Zuweisung durch ein ``if`` bedingt wird — wenn in einer Zeile gar kein "ATG" vorkommt, wird der Code dem Index auch nichts zuweisen. Wenn Du das am Ende wieder Zeilen zuordnen können möchtest, musst Du entweder auch für die Zeilen in denen "ATG" nicht vorkommt entsprechend eine leere Liste zuordnen/anhängen, oder Du musst statt einer Liste ein Wörterbuch nehmen das Zeilennummer auf "ATG"-Fundstellen abbildet. Was davon für Dich günstiger ist, dürfte von der erwarteten Häufigkeit von Zeilen ohne "ATG" und/oder davon abhängen wie die Daten weiterverarbeitet werden sollen.
``+=`` grundsätzlich mit einer Liste mit genau einem Element ist eine recht umständliche Art `append()` zu auszudrücken. Das ist die Methode um *ein* Element an eine Liste anzuhängen. Ohne das man zwischendurch noch eine temporäre Liste mit einem Element erzeugen müsste.
`add_startCodon` ist kein guter Name für etwas das keine Funktion oder Methode ist, denn es beschreibt eine Tätigkeit — wo der Leser dann eine Funktion oder Methode hinter erwartet. Die erste Zuweisung einer leeren Liste an den Namen ist überflüssig weil dieser Wert nie irgendwo verwendet wird.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import re
from collections import Counter
from itertools import islice
def process_file():
with open("TIS-Ecoli.txt", encoding="ascii") as file:
base_to_count = Counter()
possible_start_codons = []
for row in islice(file, 400):
row = row.strip()
base_to_count.update(row)
possible_start_codons.append(
[match.start() for match in re.finditer("ATG", row)]
)
print(possible_start_codons)
print(base_to_count)
Eventuell möchte man `base_to_count` hinterher noch bereinigen und/oder testen ob sich da etwas anderes als die vier Basen rein verirrt hat.