Array aus Datei einlesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Carsten_S
User
Beiträge: 5
Registriert: Freitag 15. September 2006, 08:32
Wohnort: Berlin

Array aus Datei einlesen

Beitragvon Carsten_S » Freitag 15. September 2006, 08:41

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
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Beitragvon Nirven » Freitag 15. September 2006, 09:08

Mit dem Modul csv kann man solche Daten einlesen, du kannst dann angeben womit die Daten getrennt sind.
BlackJack

Beitragvon BlackJack » Freitag 15. September 2006, 09:09

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()
Carsten_S
User
Beiträge: 5
Registriert: Freitag 15. September 2006, 08:32
Wohnort: Berlin

Beitragvon Carsten_S » Freitag 15. September 2006, 09:49

Klasse!

import csv funktioniert.

Vielen Dank an euch beide.
Carsten_S
User
Beiträge: 5
Registriert: Freitag 15. September 2006, 08:32
Wohnort: Berlin

Beitragvon Carsten_S » Mittwoch 18. Oktober 2006, 09:13

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.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Mittwoch 18. Oktober 2006, 09:39

Willst Du wirklich in arrays und nicht in Listen einlesen? Dann scheint mir PyTables eine Alternative zu sein.

Gruß,
Christian
Carsten_S
User
Beiträge: 5
Registriert: Freitag 15. September 2006, 08:32
Wohnort: Berlin

Beitragvon Carsten_S » Mittwoch 18. Oktober 2006, 09:54

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
Windows XP SP2
Python 2.5c2
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Mittwoch 18. Oktober 2006, 10:11

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']]
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Mittwoch 18. Oktober 2006, 10:14

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:

Code: Alles auswählen

[[1, 2, -4], [10, 3, -5], [100, -9, 4]]
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Mittwoch 18. Oktober 2006, 10:17

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
Carsten_S
User
Beiträge: 5
Registriert: Freitag 15. September 2006, 08:32
Wohnort: Berlin

Beitragvon Carsten_S » Mittwoch 18. Oktober 2006, 10:28

@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
Windows XP SP2

Python 2.5c2
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Mittwoch 18. Oktober 2006, 11:22

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

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]