Datei-Zugriff

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.
Antworten
Thanatos83
User
Beiträge: 12
Registriert: Dienstag 9. Mai 2006, 18:56

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!
Cu Thanatos83

Rettet die Wälder, esst mehr Biber!!!
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

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
Benutzeravatar
beewee
User
Beiträge: 35
Registriert: Mittwoch 18. Januar 2006, 22:16

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
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]]
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

@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:
Thanatos83
User
Beiträge: 12
Registriert: Dienstag 9. Mai 2006, 18:56

SAUGEIL!!!!!!!!

funzt perfekt!

Danke! :D :D :D
Cu Thanatos83

Rettet die Wälder, esst mehr Biber!!!
riven
User
Beiträge: 35
Registriert: Mittwoch 27. September 2006, 23:01

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
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()
riven
User
Beiträge: 35
Registriert: Mittwoch 27. September 2006, 23:01

ok, und wie kann ich zwischen jeder zahl ein komma einfügen?
BlackJack

Schau Dir mal die `join()`Methode auf Zeichenketten an.
riven
User
Beiträge: 35
Registriert: Mittwoch 27. September 2006, 23:01

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?
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

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()
riven
User
Beiträge: 35
Registriert: Mittwoch 27. September 2006, 23:01

vielen dank an BlackJack und DatenMetzgerX!
Hat geklappt :D
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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
Zuletzt geändert von Joghurt am Freitag 20. Oktober 2006, 18:58, insgesamt 1-mal geändert.
BlackJack

Oder besser `strip()` statt `split()`!? :-)
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

:oops: Ja, ist besser. Habs im Posting geändert.
Antworten