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

Datei-Zugriff

Beitragvon Thanatos83 » Donnerstag 8. Juni 2006, 17:23

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

Beitragvon querdenker » Donnerstag 8. Juni 2006, 17:34

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

Beitragvon beewee » Donnerstag 8. Juni 2006, 17:48

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

Beitragvon BlackJack » Freitag 9. Juni 2006, 06:59

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

Beitragvon Joghurt » Freitag 9. Juni 2006, 09:25

@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

Beitragvon Thanatos83 » Samstag 10. Juni 2006, 16:52

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

Beitragvon riven » Freitag 20. Oktober 2006, 11:30

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

Beitragvon BlackJack » Freitag 20. Oktober 2006, 13:14

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

Beitragvon riven » Freitag 20. Oktober 2006, 13:41

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

Beitragvon BlackJack » Freitag 20. Oktober 2006, 14:20

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

Beitragvon riven » Freitag 20. Oktober 2006, 14:42

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)

Beitragvon DatenMetzgerX » Freitag 20. Oktober 2006, 14:57

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

Beitragvon riven » Freitag 20. Oktober 2006, 15:10

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

Beitragvon Joghurt » Freitag 20. Oktober 2006, 17:08

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

Beitragvon BlackJack » Freitag 20. Oktober 2006, 17:17

Oder besser `strip()` statt `split()`!? :-)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]