Seite 1 von 1

Datei-Zugriff

Verfasst: Donnerstag 8. Juni 2006, 17:23
von Thanatos83
Hallo Leute,

ich hab ein kleines Problem: ich möchte eine Datei einlesen, in der mehrere Punkte sind. Sieht ungefähr so aus.

2.0 0.0 0.0
1.0 2.0 0.0
-2.0 2.0 0.0
-2.0 1.0 0.0
0.0 1.0 0.0
-1.0 -1.0 0.0
0.0 -2.0 0.0

Das sind 7 Punkte mit x, y und z Koordinaten. Problem an der Sache ist, dass die jeweilige Koordinaten in einer Zeile stehen, ich sie aber einzeln brauche. An der Datenstruktur kann ich nichts ändern, da ich die Daten nicht selber erstelle.

Meine Frage: Gibt es in der Python-Library irgendein Modul, mit dem man ganz einfach diese Punkte einlesen kann, obwohl die werte durch Leerzeichen getrennt sind, oder muss ich mir selber was implementieren?

Danke im Vorraus!

Verfasst: Donnerstag 8. Juni 2006, 17:34
von querdenker
Mal ohne Code:

-Datei Zeile für Zeile in String einlesen
-String splitten (Leerzeichen)
-die resultierende Liste sind deine Werte (x=float(resList[0]),..)

mfg, querdenker

Verfasst: Donnerstag 8. Juni 2006, 17:48
von beewee
Und jetzt mal mit Code: ;-)

Code: Alles auswählen

f = open("deinedatei.abc")
coords = []
for line in f.readlines():
    line = line.split(" ")
    for dot in line:
        coords.append(dot)
BeeWee

Verfasst: Freitag 9. Juni 2006, 06:59
von BlackJack
Mit beewee's Quelltext bekommt man alledings eine Liste in der nur die Zahlen alle hintereinander stehen. Wenn es eine Liste sein sollte in der Listen mit jeweils 3 Zahlen stehen, damit die Koordinaten als Elemente erhalten bleiben, dann geht das so:

Code: Alles auswählen

lines = open('Dateiname', 'r')
coordinates = [map(float, line.split()) for line in lines if line.strip()]
lines.close()
Ergebnis für die Beispieldaten:

Code: Alles auswählen

[[2.0, 0.0, 0.0],
 [1.0, 2.0, 0.0],
 [-2.0, 2.0, 0.0],
 [-2.0, 1.0, 0.0],
 [0.0, 1.0, 0.0],
 [-1.0, -1.0, 0.0],
 [0.0, -2.0, 0.0]]

Verfasst: Freitag 9. Juni 2006, 09:25
von Joghurt
@beewee: datei.readlines ist in diesem Falle unpraktisch, da es die gesamte Datei auf einmal in eine Liste einliest und erst danach über diese Liste iterierst, was du suchst, ist eigentlich xreadlines (genauso wie xrange vs. range), allerdings ist xreadlines inzwischen durch __iter__ implementiert.

Lange Rede, kurzer Sinn: schreib

Code: Alles auswählen

for line in f:

Verfasst: Samstag 10. Juni 2006, 16:52
von Thanatos83
SAUGEIL!!!!!!!!

funzt perfekt!

Danke! :D :D :D

Verfasst: Freitag 20. Oktober 2006, 11:30
von riven
hi,

ich habe eine datei nach folgendem schema:

3000
0.04
0
1
1
usw.

mich interessieren die werte ab der dritten zeile, sie sollen folgendermaßen erfasst werden: 0, 1, 1, usw.

danke

Verfasst: Freitag 20. Oktober 2006, 13:14
von BlackJack
Im einfachsten Fall sieht das ungefähr so aus:

Code: Alles auswählen

datafile = open('data.txt', 'r')
result = map(int, datafile.readlines()[2:]) 
datafile.close()

Verfasst: Freitag 20. Oktober 2006, 13:41
von riven
ok, und wie kann ich zwischen jeder zahl ein komma einfügen?

Verfasst: Freitag 20. Oktober 2006, 14:20
von BlackJack
Schau Dir mal die `join()`Methode auf Zeichenketten an.

Verfasst: Freitag 20. Oktober 2006, 14:42
von riven
hi, also mit

import string
datafile=open('testwave1.dat', 'r')
result=datafile.readlines()[3:]
d=string.join(result, ",")
datafile.close()

erreiche ich, dass die zahlenwerte folgendermaßen ausgedruckt werden:

0
,0
,0
,usw

mich stört also die leerzeile die angefügt wird.

ich möchte, dass alles folgendermaßen aussieht:

0, 0, 0, usw.

wie kann ich dies erreichen?

Verfasst: Freitag 20. Oktober 2006, 14:57
von DatenMetzgerX

Code: Alles auswählen

#UNGETESTET
datafile=open('testwave1.dat', 'r') 
d = ','.join(datafile.readlines()[3:])
d = d.replace('\n', '')  #musst die linefeeds entfernen
datafile.close()

Verfasst: Freitag 20. Oktober 2006, 15:10
von riven
vielen dank an BlackJack und DatenMetzgerX!
Hat geklappt :D

Verfasst: Freitag 20. Oktober 2006, 17:08
von Joghurt
DatenMetzgerX hat geschrieben:

Code: Alles auswählen

#UNGETESTET
datafile=open('testwave1.dat', 'r') 
d = ','.join(datafile.readlines()[3:])
d = d.replace('\n', '')  #musst die linefeeds entfernen
datafile.close()
Vielleicht besser:

Code: Alles auswählen

datafile = open("testwave1.dat", "r")
d = ",".join([x.strip() for x in datafile.readlines()[3:]])
datafile.close()
Edit: split() durch das korrekte strip() ersetzt

Verfasst: Freitag 20. Oktober 2006, 17:17
von BlackJack
Oder besser `strip()` statt `split()`!? :-)

Verfasst: Freitag 20. Oktober 2006, 18:58
von Joghurt
:oops: Ja, ist besser. Habs im Posting geändert.