Formate in Record Array

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
m-i-c-h-l
User
Beiträge: 3
Registriert: Freitag 24. April 2009, 15:50

Freitag 24. April 2009, 16:01

Hallo,
ich bin recht neu in Python und benutze zum ersten mal Record Arrays. Ich kann ein csv file mit csv2rec einlesen und mit rec2csv erfolgreich wieder schreiben. Leider gehen mir dabei sämtliche Formate verloren. Ich habe strings, integers, floats und am liebsten würde ich unterschiedlich viele Dezimalstellen, und die "wissenschaftliche" Schreibweise (also 1e-10) alle in einem file benutzen.
Kann mir jemand erklären wie dies geschieht, bzw. die nötigen Stichworte liefern?
Dinge wie
matplotlib.mlab.csvformat_factory(format)
formatd = dict(...
dtype='%s %s i0 %s %s i....
haben nicht funktioniert...

Vielen Dank
michl
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Samstag 25. April 2009, 09:11

kannst du mal ein beispiel-csv posten?
und dann genau zeigen wo du das format verlierst...

habe das mal gemacht, ist aber schon her und kann dir jetzt grade nicht 100% folgen...
m-i-c-h-l
User
Beiträge: 3
Registriert: Freitag 24. April 2009, 15:50

Montag 27. April 2009, 08:42

Hi,
vielen Dank schonmal für Dein Interesse!
das zu lesende File sieht (gekürzt) so aus:

file runnumber peakelutiontime peaktype orgpeaknumber rt majorheight minorheight
20090210_AirControle_SimpleLoop_23STP_69 69 1234267681 Sample 2.0 2228.0 1.62857 0.000597055
20090210_AirControle_SimpleLoop_23STP_68 68 1234259232 Sample 2.0 2228.0 1.60818 0.000587436

Dies lese ich mit folgender Zeile ein:

recarray = csv2rec(filename, comments='#', skiprows=0, checkrows=0, delimiter=' ')

Dann ordne ich die Daten anders an und schreibe sie mit:

rec2csv(recarray, filename, delimiter=' ')

Nun sieht die Datei so aus:

file runnumber peakelutiontime peaktype orgpeaknumber rt majorheight minorheight

20090210_AirControle_SimpleLoop_23STP_68 68 1234259232 Sample 2.0 2228.0 1.6079000000000001 0.00058732599999999999

20090210_AirControle_SimpleLoop_23STP_69 69 1234267681 Sample 2.0 2228.0 1.6287400000000001 0.00059708099999999996

Ich hätte gerne, dass die geschriebene Datei gleich oder gar besser formatiert ist. Also zum Beispiel für den letzten Eintrag hätte würde ich die Schreibweise 5.8735E-4 vorziehen. bei der zweitletzten Zeile einfach nach der 4. Dezimalstelle abbrechen.... Die dritte Spalte ist eine UTC Zeit, die kann ich aber auch als string behandeln...

Besten Gruss
michl
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Montag 27. April 2009, 11:05

m-i-c-h-l
User
Beiträge: 3
Registriert: Freitag 24. April 2009, 15:50

Montag 27. April 2009, 14:54

Danke, das sind auf jeden Fall wichtige Dinge. Ich habe es geschafft die Formate mit

myformat = dict(
type = str.format(mlab.FormatString()),
file = str.format(mlab.FormatInt()),
runnumber = str.format(mlab.FormatFloat(2)),
peakelutiontime = str.format(mlab.FormatFloat(5))
...
)

zu kreieren und sogar mit

myformat = recarray.dtype

beim einlesen zu erstellen (das sieht dann wie folgt aus)
[('type', '|S14'), ('file_', '|S48'), ('runnumber', '|S3'), ('peakelutiontime', '<i4'), ('peaktype', '|S2'), ('orgpeaknumber', '|S4'), ('rt', '<f8'), ('majorheight', '<f8'), ('minorheight', '<f8'), ('majorarea', '<f8'), ('minorarea', '<f8'), ('areabyheight', '<f8'), ('ratio', '<f8'), ('delta', '<f8'), ('shotnoise', '<f8'), ('peaklength', '<f8'), ('peakstart', '<f8'), ('peakend', '<f8'), ('bg2', '<f8'), ('bg3', '<f8'), ('sig2bg2', '<f8'), ('sig2bg3', '<f8'), ('supplinfo', '|S50'), ('comment', '|S46')]

aber dies macht immer noch 2 Probleme:

1. scheint dieses myformat nicht in csv2rec reinzupassen, die Fehlermeldung ist:
delimiter=csvdelimiter, formatd=myformat)
File "/usr/lib/python2.5/site-packages/matplotlib/mlab.py", line 2542, in rec2csv
formatd = get_formatd(r, formatd)
File "/usr/lib/python2.5/site-packages/matplotlib/mlab.py", line 2409, in get_formatd
format = formatd.get(name)
AttributeError: 'numpy.dtype' object has no attribute 'get'

2. es werden die sinnlosen nachkommstellen immer noch mit in die Datei geschrieben
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Dienstag 28. April 2009, 12:20

sorry, ich müsste jetzt den kram installieren um dir weiterzuhelfen.
dazu habe ic im moment leider keine zeit.

weiss sonst evtl jmd weiter?
http://www.kinderpornos.info
Antworten