Text-File als Array 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.
Antworten
-jOe-
User
Beiträge: 3
Registriert: Mittwoch 8. August 2012, 08:59

Mittwoch 8. August 2012, 09:27

Liebes Forumsteam!

Folgendes Problem: Eine txt-File soll als Array eingelesen werden um es danach manipulieren zu können. Nun habe ich allerdings festgestellt das Python jedem einzelnen Zeichen eine Position in der Matrix zuweist und nicht wie von mir angenommen jeder Zeichensatz eine eigene Position bekommt und somit eine Auswertung möglich wird.

Ich habe mitbekommen, dass es gerade eine "Neulingsdiskussion" im Forum gibt. Wie man vl aus meinem Problem erkennt, bin ich auch neu auf Python. Ich habe auch vorab versucht das Problem durch alte Forumsbeiträge - nicht nur in diesem Forum - bzw. der Dokumentation zu lösen, bin allerdings auf keinen grünen Nenner gekommen und hoffe ihr habt einen Tip wie man eine txt-Datei so in ein Array einliest, dass einzelne Wörter bzw. Zahlen eine Pos. zugewiesen bekommen und nicht einzelne Zeichen.

Herzlichen Dank vorab.
Beste Grüße jOe

Code: Alles auswählen

import os

Daten_Pfad=raw_input("Directory of data: ")
os.chdir(Daten_Pfad)

Filename=raw_input("Filename: ")
File=open((Filename + ".txt"),"rb")

File.seek(0,0)
MatFile=File.read()

Mat=list(MatFile)
print Mat

File.close
deets

Mittwoch 8. August 2012, 09:41

Es gibt zu deinem Code ne Menge zu sagen. Zb das voellig unnoetige seek, das wirkungslose close (da fehlen Klammern hinter) sowie die unueblichen Namenskonventionen und Code-Formatierungen.

Das alles ist aber nebensaechlich, denn was wirklich fehlt ist ein Beispiel, wie deine *DATEN* aussehen. Denn davon haengt nunmal ab, wie die eingelesen werden muessen...
-jOe-
User
Beiträge: 3
Registriert: Mittwoch 8. August 2012, 08:59

Mittwoch 8. August 2012, 09:51

Danke für die Hinweise.

Das sind die Daten, die ich gerade verwende. Sie sind allerdings nur beispielhaft, haben also die gleiche Struktur, sind aber nicht jene Daten die ich in Zukunft verarbeiten möchte.
Datum Zeit Temp. I. Temp. A. Pool Feuchte I. Feuchte A. Luftdruck Regen Wind Richtung Richtung UV Taupunkt Windchill Windböen
02.08.2012 16:10 26,0 °C 31,7 °C 33,2 °C 62 % 48 % 1012,2 hPa 0,0 l/m² 3,4 km/h (1 Bft) SO 135 ° 4,0 UV-I 19,3 °C 31,7 °C 6,9 km/h (2 Bft)
02.08.2012 16:00 26,0 °C 31,6 °C 33,2 °C 62 % 49 % 1012,0 hPa 0,0 l/m² 1,9 km/h (1 Bft) S 180 ° 4,1 UV-I 19,6 °C 31,6 °C 3,2 km/h (1 Bft)
02.08.2012 15:50 25,9 °C 31,3 °C 33,2 °C 62 % 48 % 1012,0 hPa 0,0 l/m² 4,5 km/h (1 Bft) N-NO 22 ° 4,9 UV-I 18,9 °C 31,3 °C 3,5 km/h (1 Bft)
02.08.2012 15:40 25,9 °C 31,5 °C 33,2 °C 62 % 47 % 1012,1 hPa 0,0 l/m² 4,7 km/h (1 Bft) NO 45 ° 5,0 UV-I 18,8 °C 31,5 °C 8,0 km/h (2 Bft)
02.08.2012 15:30 25,8 °C 31,9 °C 33,2 °C 62 % 49 % 1012,1 hPa 0,0 l/m² 2,9 km/h (1 Bft) SO 135 ° 5,1 UV-I 19,8 °C 31,9 °C 5,1 km/h (1 Bft)
02.08.2012 15:20 25,7 °C 32,0 °C 33,2 °C 62 % 45 % 1012,0 hPa 0,0 l/m² 3,7 km/h (1 Bft) SO 135 ° 5,2 UV-I 18,5 °C 32,0 °C 5,8 km/h (2 Bft)
02.08.2012 15:10 25,7 °C 31,7 °C 33,2 °C 63 % 49 % 1012,0 hPa 0,0 l/m² 3,4 km/h (1 Bft) S 180 ° 5,2 UV-I 19,6 °C 31,7 °C 2,3 km/h (1 Bft)
02.08.2012 15:00 25,6 °C 31,7 °C 33,2 °C 63 % 47 % 1012,2 hPa 0,0 l/m² 3,5 km/h (1 Bft) O 90 ° 5,6 UV-I 19,0 °C 31,7 °C 4,2 km/h (1 Bft)
02.08.2012 14:50 25,6 °C 31,8 °C 33,1 °C 62 % 47 % 1012,2 hPa 0,0 l/m² 2,3 km/h (1 Bft) S-SO 157 ° 5,9 UV-I 19,1 °C 31,8 °C 2,4 km/h (1 Bft)
02.08.2012 14:40 25,6 °C 31,7 °C 33,1 °C 62 % 48 % 1012,5 hPa 0,0 l/m² 3,5 km/h (1 Bft) O-NO 67 ° 6,1 UV-I 19,3 °C 31,7 °C 10,9 km/h (2 Bft)
02.08.2012 14:30 25,5 °C 31,6 °C 33,1 °C 62 % 46 % 1012,5 hPa 0,0 l/m² 2,7 km/h (1 Bft) O-NO 67 ° 6,4 UV-I 18,5 °C 31,6 °C 5,0 km/h (1 Bft)
Benutzeravatar
/me
User
Beiträge: 3262
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mittwoch 8. August 2012, 09:52

-jOe- hat geschrieben:Folgendes Problem: Eine txt-File soll als Array eingelesen werden um es danach manipulieren zu können.
Sicher? Arrays werden in Python im Gegensatz zu Listen nicht so häufig verwendet und ich wundere mich einfach, wie ein Einsteiger auf die Idee der Verwendung eines Arrays kommt.

Einzelne Zeilen in eine Liste einzulesen würde beispielsweise so aussehen:

Code: Alles auswählen

with open(__file__) as fh:
    data = fh.readlines()
print data
Wenn du etwas anders möchtest, dann beschreibe deine Daten.
deets

Mittwoch 8. August 2012, 09:58

Oh mein Gott. Wer schreibt die denn? Besteht der White-Space zwischen den Spaltennamen (die ja selbst Leerzeichen enthalten... ) und den Spalten selbst Tabulatoren? Wenn nicht, dann wirst du da mit dem CSV-Modul das man sonst empfehlen koennte nicht gluecklich werden.

Unter der Annahme, dass das alles einfach nur Leerzeichen sind - string.split ist dein Freund, so grob:

Code: Alles auswählen


inf = open(...) # datei oeffnen so wie gehabt

rows = []
for line in inf:
     parts = line.split()
     row = {}
     for name, index, converter in [
         ("temp_i", 2, lambda v: float(v.replace(",", ".")),
         ... # weitere spalten-konverter
     ]:
           row[name] = converter(parts[index])
Benutzeravatar
/me
User
Beiträge: 3262
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mittwoch 8. August 2012, 10:01

Das sieht eindeutig nach tabulatorseparierten Daten aus. Eine einzelne Zeile könntest du mit line.split('\t') zerlegen. Alternativ könntest du die Daten auch gleich mit dem csv-Modul einlesen.
Benutzeravatar
/me
User
Beiträge: 3262
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mittwoch 8. August 2012, 10:03

deets hat geschrieben:Oh mein Gott. Wer schreibt die denn? Besteht der White-Space zwischen den Spaltennamen (die ja selbst Leerzeichen enthalten... ) und den Spalten selbst Tabulatoren?
Wenn man sich den Text im Editor anschaut würde ich das bejahen. Der Anzeigelayer der Forumssoftware haut das Zeug zu normalen Leerzeichen zusammen.
-jOe-
User
Beiträge: 3
Registriert: Mittwoch 8. August 2012, 08:59

Mittwoch 8. August 2012, 10:21

Mit der split-Funktion sowie der Code-Hilfe von deets funktioniert es jetzt.
Herzlichen Dank an Euch.
Grüße jOe
Antworten