Seite 1 von 1
Array aus Datei einlesen
Verfasst: Freitag 15. September 2006, 08:41
von Carsten_S
Hallo Forum,
ich habe folgendes Problem:
wie kann man eine textdatei folgender gestalt:
1 3 7
3 6 8
7 5 3
in ein array einlesen?
die einzelnen zahlen sind mit tabulatoren getrennt.
wie man einzelne zeilen aus einer datei einlesen kann weiss ich...
leider bringt mir das nicht viel
Vielen Dank.
Grüsse
Carsten
Verfasst: Freitag 15. September 2006, 09:08
von Nirven
Mit dem Modul csv kann man solche Daten einlesen, du kannst dann angeben womit die Daten getrennt sind.
Verfasst: Freitag 15. September 2006, 09:09
von BlackJack
Das kannst Du zum Beispiel mit dem `csv` Modul machen.
Code: Alles auswählen
In [14]: f = open('test.csv', 'rb')
In [15]: r = csv.reader(f, delimiter='\t')
In [16]: [map(int, row) for row in r]
Out[16]: [[1, 3, 7], [3, 6, 8], [7, 5, 3]]
In [17]: f.close()
Verfasst: Freitag 15. September 2006, 09:49
von Carsten_S
Klasse!
import csv funktioniert.
Vielen Dank an euch beide.
Verfasst: Mittwoch 18. Oktober 2006, 09:13
von Carsten_S
Hallo,
nachdem mir letztens so schön geholfen wurde hätte ich eine weitere Frage.
Mein Programm ist soweit fertig. Ich habe nur folgendes Problem.
Mein einzulesende Datei (welche ich bekanntermassen in ein
Array abspeichern möchte) hat nun ein etwas anderes Assehen:
__1 +2 -4
_10 +3 -5
100 -9 +4
_ dient nur zu Illustration des Leerzeichens
Das heisst, der "delimiter" ist kein Tabulator sondern jeweils ein Leerzeichen.
Die erste Zeile startet mit 2 Leerzeichen.
Die zweite Zeile beginnt mit einem Leerzeichen.
Vor den Zahlen steht (+) oder (-)*
*keine Ahnung inwieweit das ein Problem ist.
Ich hoffe das Problem ist lösbar.

Vielen Dank im Voraus.
Verfasst: Mittwoch 18. Oktober 2006, 09:39
von CM
Willst Du wirklich in arrays und nicht in Listen einlesen? Dann scheint mir
PyTables eine Alternative zu sein.
Gruß,
Christian
Verfasst: Mittwoch 18. Oktober 2006, 09:54
von Carsten_S
Hallo CM,
ich möchste die Daten in eine Liste speichern.
PyTables ist auf den ersten Blick ziemlich umfangreich

Ich möchte ja eigentlich nur eine Datei mit 3 Zeilen einlesen.
Wenn es irgendwie einfacher geht als mit PyTables würde ich mich
deshalb sehr freuen.
Freue mich auf Antwort,
Carsten
Verfasst: Mittwoch 18. Oktober 2006, 10:11
von Rebecca
Meinst du sowas:
Code: Alles auswählen
f = open("test.txt");
lines = f.readlines();
all_numbers = [];
for l in lines:
all_numbers.append(l.strip().split());
print all_numbers
all_numbers sieht dann so aus:
Code: Alles auswählen
[['1', '+2', '-4'], ['10', '+3', '-5'], ['100', '-9', '+4']]
Verfasst: Mittwoch 18. Oktober 2006, 10:14
von Rebecca
Ach, und wenn du die Zahlen dann gerne als Integers haettest statt als Strings, koennte die for-Schleife so aussehen:
Code: Alles auswählen
for l in lines:
numbers = [int(i) for i in l.strip().split()];
all_numbers.append(numbers);
Da kommt das hier raus:
Verfasst: Mittwoch 18. Oktober 2006, 10:17
von CM
Nun, Du sprachst von array, die Andern antworten mit Liste, da kann man ja mal Vermutungen anstellen.
Und wo liegt jetzt die Schwierigkeit? Meine Strategie, wenn ich irgendwelche blöden csv-ähnlich-Formate habe, ist erst einmal probieren (andere delimiter), ggf. gar nicht csv verwenden, sondern diverse Variationen auf Rebeccas Ansatz (auch split() kann sehr flexibel eingesetzt werden).
Gruß,
Christian
Verfasst: Mittwoch 18. Oktober 2006, 10:28
von Carsten_S
@Rebecca
Vielen Dank, das müsste von der Art her gehen.
@CM
Sorry, mein Fehler.
Ich dachte Array und Liste sind in Phyton vom Prinzip her dasselbe.
Auf die Frage ob Array oder Liste hatte ich dir dann aber geantwortet.
Ich hatte auch schon auf verschiedenen newsgroups und seiten
nach anderen delimitern gesucht.
Aber vielleicht bin ich auch nur zu dumm
Kannst du mir (rein zur Info) vielleicht nochmal sagen wie man
das Leerzeichen bzw. whitesapce als delimiter eingibt?
Das "\t" ja für Tabulator steht , weiss ich ja jetzt schon durch dich.
Grüsse, Carsten
Verfasst: Mittwoch 18. Oktober 2006, 11:22
von CM
Bei split() nehme ich an?
Code: Alles auswählen
S.split([sep [,maxsplit]]) -> list of strings
Return a list of the words in the string S, using sep as the
delimiter string. If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator
Das ist einfach der Docstring.
Gruß,
Christian