@Neuling7: Bitte sofort aufhören irgendwelche Nummern an Namen anzuhängen sondern gleich sinnvolle Namen wählen. Die sind nicht nur für den Leser wichtig um ein Programm zu verstehen, sondern auch wenn der Autor eines Programms schwierigkeiten hat einen sinnvollen Namen für etwas zu finden, ist das sehr oft ein Zeichen dafür das es ein Problem gibt. Zum Beispiel weil der Autor selbst nicht wirklich verstanden hat was für einem Wert er da einen Namen gibt, oder weil der Wert aus mehreren nicht wirklich zusammengehörenden Werten zusammengesetzt ist.
`textstring` ist an sich schon kein guter Name für einen Wert der gar keine Zeichenkette mit Text ist. Das ist eine Liste und Listen (und anderen Sequenzen) gibt man in der Regel die Mehrzahl von dem Namen der für ein einzelnes Element passend wäre. Die einzelnen Elemente sind Zeilen aus Dateien, also währe `lines` ein guter Name. Zumindest solange man nicht mehr über die Bedeutung dieser Zeilen weiss.
Du kennst doch bereits ``for``-Schleifen, warum dann die ``while``-Schleife? ``while``-Schleifen verwendet man wenn man keinen einfachen Weg hat ein iterierbares Objekt über Werte zu erstellen. Ein `range()`-Objekt ist aber leicht erstellt, spart zwei Zeilen Code ein, und macht das ganze einfacher, denn man kann am Schleifenkopf alles ablesen und muss nicht den ganzen Schleifenkörper nach potentiellen Veränderungen von `i` absuchen.
`eingabe` ist nirgends definiert und führt zu einem `NameError`.
Das zusammenstückeln von literalen Zeichenketten und Werten mit ``+`` und `str()` ist eher BASIC als Python. In Python gibt es dafür Zeichenkettenformatierung mittels `format()`-Methode.
`getValues()` sollte `get_values()` heissen. Mehr zu konventionellen Namensschreibweisen findet sich im
Style Guide for Python Code.
Die Ausnahmebehandlung ist so nicht sinnvoll, denn wenn die Datei nicht geöffnet werden konnte, dann ist auch der Name `file` nicht definiert — beziehungsweise haben wir hier gleich ein weiteres Problem: `file` ist bereits definiert, und zwar ist das der Name für Python's Dateityp. Und das führt dann ein paar Zeilen weiter zu dem nächsten Problem das man über den Dateityp nicht iterieren kann:
Code: Alles auswählen
In [17]: for line in file:
...: pass
...:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-17-23873b411703> in <module>()
----> 1 for line in file:
2 pass
TypeError: 'type' object is not iterable
Eine *sinnvolle* Fehlerbehandlung ist ganz selten nur ein `print()` und dann so weitermachen als sei gar kein Fehler aufgetreten, denn der nachfolgend ausgeführte Code geht ja davon aus es sei keine Ausnahme aufgetreten und macht weiter als sei alles in Ordnung. Du musst Dir hier also überlegen was die Funktion machen/zurückgeben soll/muss wenn die Datei nicht geöffnet werden konnte. Beziehungsweise ob diese Ausnahme *in* der Funktion überhaupt sinnvoll behandelt werden kann, oder ob das nicht eher eine Entscheidung ist, die man dem Aufrufer überlassen muss/sollte.
Die Werte in die `values`-Liste zu bringen ist komplizierter gelöst als nötig denn man kann `list()` einfach ein iterierbares Objekt übergeben und bekommt dann eine Liste mit den Elementen zurück.
Du öffnest die Dateien, schliesst sie aber nicht wieder. Das sollte man aber tun. Am besten schaust Du Dir in dem Zusammenhang mal die ``with``-Anweisung an.
Das Problem mit dem Code ist das da keine vorherigen Werte aus der Liste (ein Array ist etwas anderes!) gelöscht werden, sondern das Du in jedem Schleifendurchlauf mit einer *neuen* Liste anfängst. Du willst *vor* der Schleife die Liste anlegen. In `getValues()` hast Du es doch auch so gemacht.
Zudem ist die ``+``-Operationen auch ineffizient denn damit erstellst Du jedes mal eine neue Liste in die alle Elemente der beiden Operanden kopiert werden und die alte Liste `textstring4` wird danach gelöscht beziehungsweise zum Löschen freigegeben. Es wäre sinnvoller die Liste einfach um die neuen Werte zu erweitern.
Ungetestet:
Code: Alles auswählen
def main():
eingabe = 'test'
lines = list()
for filename in ('{}{}.txt'.format(eingabe, i) for i in range(1, 5)):
try:
with open(filename) as file_lines:
lines.extend(file_lines)
except OSError:
print('Probleme bei Datei {0!r}.'.format(filename))
print(lines)
if __name__ == '__main__':
main()