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
Formate in Record Array
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
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
schau mal hier:
http://docs.python.org/tutorial/floatingpoint.html
und hier:
http://www.python.org/doc/2.5.2/lib/typ ... rings.html
(was du brauchst ist %e)
http://docs.python.org/tutorial/floatingpoint.html
und hier:
http://www.python.org/doc/2.5.2/lib/typ ... rings.html
(was du brauchst ist %e)
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
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