Anfänger Textdatei strukturiert in 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
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Guten Tag bin neu auf Python

Klase finde ich das webinterface unterstützung

abner ich komm nicht weiter

meine eingelesenen dateien (TXT)haben folgende struktur
Date,Open,High,Low,Close,Volume,Adj Close
2008-02-15,8.63,8.72,8.27,8.33,1047500,8.33
2008-02-14,8.99,9.07,8.60,8.71,664100,8.71
2008-02-13,8.73,8.95,8.63,8.87,818200,8.87
2008-02-12,8.50,8.82,8.38,8.81,798400,8.81
2008-02-11,8.23,8.47,8.23,8.43,489100,8.43
2008-02-08,8.33,8.45,8.25,8.35,444500,8.35
2008-02-07,8.45,8.50,8.06,8.20,963800,8.20
2008-02-06,8.20,8.71,7.92,8.65,990000,8.65

in c würde ich nun jeden datensatz in ein Strukt einlesen

also datei öffnen
zeilenweise einlesen
auf strukt_array aufteilen und
dann das array zur weiterverarbeitung zurverfügung stellen

in Pyton hab ich nun ein beispiel das mich allerdings nicht weiterbringt gefunden

Code: Alles auswählen

 
    in_file = open(filename, "r")
    while True:
        in_line = in_file.readline()
        if not in_line:
            break
        in_line = in_line[:-1]
        name, number = in_line.split(",")
        numbers[name] = number
    in_file.close()

 
array DATEN[] enthhält strukt
oder ist das hier anders
meine strukt sollte so aussehen
Date,Open,High,Low,Close,Volume,Adj Close

zugriff wäre dann a float = Daten[x].open
ich bitte um hilfe
danke
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Eine sehr generische Möglichkeit ist es das ganze mit Dictionaries zu lösen.
Du kannst natürlich auch eine Klasse schreiben, welche die Struktur der Textdatei kennt und den Attributen den entsprechenden Wert der Spalte zuordnen. Dann musst du allerdings die Struktur deiner Klasse immer an die deiner Textdatei anpassen.

Hier zwei Beispiele wie ich es machen würde (sofern die Datenmenge nicht allzu groß ist und man Speicher sparen möchte):
Am besten unbekannte Funktionen im Interpreter ausprobieren.
Es kann nicht schaden wenn man zip, strip, dict usw kennt.

mit csv Modul:

Code: Alles auswählen

import csv

# Einlesen der Testdatei ("," ist bei csv der Default-Delimiter)
content = csv.reader(open("test.txt"))
# In der ersten Zeile stehen die Spaltennamen, die speichern wir uns
keys = content.next()
data = []
for line in content:
    # Nun hängen wir die restlichen Zeilen an unsere Liste an und 
    # versehen jeden Spalteneintrag mit dem entsprechenden Namen 
    # ( organisiert als dictionary )
    data.append(dict(zip(keys, line)))

print data[0]["Close"]
ohne irgendein Modul

Code: Alles auswählen

f = open("test.txt")
# In der ersten Zeile stehen die Spaltennamen, die speichern wir uns
delimiter = ","
keys = f.readline().strip().split(delimiter)
data = []
for line in f.readlines():
    data.append(dict(zip(keys, line.strip().split(delimiter))))
    
print data[0]["Close"]
BlackJack

@zap: Für die erste Lösung gibt's in `csv` schon den `DictReader`:

Code: Alles auswählen

In [392]: f = open('test.txt', 'rb')

In [393]: reader = csv.DictReader(f)

In [394]: data = list(reader)

In [395]: f.close()

In [396]: data[0]['Close']
Out[396]: '8.33'
Da aber Datenumwandlungen nötig sind, sofern man mit den Werten auch rechnen möchte, würde ich auch zu Klassen raten. Vielleicht auch zu einer Klasse, die so eine gesamte Tabelle kapselt.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Stimmt, hatte den Gedanken auch eine Minute nach dem Abschicken. Aber ist doch für nen Anfänger arg Blackbox ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Für eine Python-Neuling vielleicht etwas transparenter:

Code: Alles auswählen

daten = list()
file = open("test.txt","r")
for line in file:
    data.append(line.strip().split(","))
file.close()
Oder vielleicht besser noch so:

Code: Alles auswählen

data = list()
file = open("test.txt","r")
for line in file:
    line = line.strip() 
    line_list = line.split(",") 
    data.append(line_list)
file.close()
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

DANKE


und wie bekomme ich nun aus einer Dicionary den maxwert einer bestimmten spalte

Code: Alles auswählen

print max(data[]['High'])
geht nicht rechnen mit str geht ja wohl auch nicht

Code: Alles auswählen

a=float(data[len(data)-1]['Low'])
a=a*2
print a
so kann man rechnen

bitte hilfe bei Dicionary Spalten maximum
BlackJack

Code: Alles auswählen

import csv

def convert_record(record):
    return dict((name, float(value) if name != 'Date' else value)
                for name, value in record.iteritems())

def main():
    quote_file = open('test.txt', 'rb')
    data = map(convert_record, csv.DictReader(quote_file))
    quote_file.close()
    print max(x['High'] for x in data)

if __name__ == '__main__':
    main()
Antworten