Seite 1 von 1

Array abspoeichern

Verfasst: Mittwoch 16. September 2009, 12:58
von DanielMamba
Hi,

weiss jemand wie ich ein array als datei abspeichern kann und danach in einer neuen sitzung wieder aufrufen kann? Ich hab das schon mir pickle probiert, aber das unterstützt keine arrays.

Vielen Dank,

Grüsse Mamba

Verfasst: Mittwoch 16. September 2009, 13:04
von würmchen
shelve kann das, hat aber ein paar Eigenheiten...

Verfasst: Mittwoch 16. September 2009, 13:06
von CM
Hoi,

array? Was meinst Du? Wenn ich von Deinen vorherigen Threads raten darf, ndarray von numpy? In dem Fall: numpy.savetxt() und numpy.loadtxt() aber auch my_ndarray.dump(file) - zum eigentlichen picklen.

HTH
Christian

Verfasst: Mittwoch 16. September 2009, 13:06
von cofi
Wenn pickle das nicht kann, bezweifel ich, dass shelve mitspielt.

Um welche Arrays geht es denn? Numpy?
Wenn ja, solltest du Funktionen zum speichern finden. AFAIR ``savetxt``

Verfasst: Mittwoch 16. September 2009, 13:08
von CM
shelve erzeugt gepicklete dict-ähnliche Objekte - das ist nicht dasselbe wie ein array picklen.

Re: Array abspoeichern

Verfasst: Mittwoch 16. September 2009, 13:08
von Hyperion
DanielMamba hat geschrieben:Ich hab das schon mir pickle probiert, aber das unterstützt keine arrays.
Also ich kann das bei mir:

Code: Alles auswählen

In [38]: array.array("l", range(5))
Out[38]: array('l', [0, 1, 2, 3, 4])

In [39]: a = array.array("l", range(5))

In [40]: a
Out[40]: array('l', [0, 1, 2, 3, 4])

In [41]: import pickle

In [42]: pickle.dumps(a)
Out[42]: "carray\narray\np0\n(S'l'\np1\nS'\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x
00\\x02\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x04\\x00\\x00\\x00'\np2\ntp3\nRp4\n.
"

In [43]: stored = pickle.dumps(a)


In [44]: b = pickle.loads(stored)

In [45]: b
Out[45]: array('l', [0, 1, 2, 3, 4])
Edit: Ok, ich dachte an das array-Modul!

Re: Array abspoeichern

Verfasst: Mittwoch 16. September 2009, 13:15
von DanielMamba
Hyperion hat geschrieben:
DanielMamba hat geschrieben:Ich hab das schon mir pickle probiert, aber das unterstützt keine arrays.
Also ich kann das bei mir:

Code: Alles auswählen

In [38]: array.array("l", range(5))
Out[38]: array('l', [0, 1, 2, 3, 4])

In [39]: a = array.array("l", range(5))

In [40]: a
Out[40]: array('l', [0, 1, 2, 3, 4])

In [41]: import pickle

In [42]: pickle.dumps(a)
Out[42]: "carray\narray\np0\n(S'l'\np1\nS'\\x00\\x00\\x00\\x00\\x01\\x00\\x00\\x
00\\x02\\x00\\x00\\x00\\x03\\x00\\x00\\x00\\x04\\x00\\x00\\x00'\np2\ntp3\nRp4\n.
"

In [43]: stored = pickle.dumps(a)


In [44]: b = pickle.loads(stored)

In [45]: b
Out[45]: array('l', [0, 1, 2, 3, 4])
Edit: Ok, ich dachte an das array-Modul!
ja genau, das funktioniert bei mir auch...allerdings ist es bei der nächsten Sitzung nicht mehr aufrufbar. Muss man es also in eine Datei schrieben?

Gruss Mamba

Verfasst: Mittwoch 16. September 2009, 13:16
von lutz.horn
Ich würde YAML oder JSON als Serialisierungsformat verwenden.

Code: Alles auswählen

import json

json.dump([1, 2, 3], open("array.json", "w"))
json.load(open("array.json"))
# => [1, 2, 3]

Re: Array abspoeichern

Verfasst: Mittwoch 16. September 2009, 13:19
von Hyperion
DanielMamba hat geschrieben: ja genau, das funktioniert bei mir auch...allerdings ist es bei der nächsten Sitzung nicht mehr aufrufbar. Muss man es also in eine Datei schrieben?
Ja natürlich! So funktioniert nun einmal Persistenz - Du musst schon selber ein File-Object bereitstellen und dann die dump()-Funktion nutzen (nicht dumps - das "s" steht ja grad für "string"). Ansonsten erzeugst Du eben einen String, der mit dem Interpreter stirbt :-)

Verfasst: Mittwoch 16. September 2009, 13:21
von Hyperion
lutz.horn hat geschrieben:Ich würde YAML oder JSON als Serialisierungsformat verwenden.
Nur das JSON laut Doku arrays nativ nicht serialisieren kann ;-)

Code: Alles auswählen

In [47]: a = array.array("l", range(5))

In [48]: json.dumps(a)
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (41, 0))

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

C:\Programme\Python26\Scripts\<ipython console> in <module>()

C:\Programme\Python26\lib\json\__init__.pyc in dumps(obj, skipkeys, ensure_ascii
, check_circular, allow_nan, cls, indent, separators, encoding, default, **kw)
    228         cls is None and indent is None and separators is None and
    229         encoding == 'utf-8' and default is None and not kw):
--> 230         return _default_encoder.encode(obj)
    231     if cls is None:
    232         cls = JSONEncoder

C:\Programme\Python26\lib\json\encoder.pyc in encode(self, o)
    365         # exceptions aren't as detailed.  The list call should be roughl
y

    366         # equivalent to the PySequence_Fast that ''.join() would do.

--> 367         chunks = list(self.iterencode(o))
    368         return ''.join(chunks)
    369

C:\Programme\Python26\lib\json\encoder.pyc in _iterencode(self, o, markers)
    315                     raise ValueError("Circular reference detected")
    316                 markers[markerid] = o
--> 317             for chunk in self._iterencode_default(o, markers):
    318                 yield chunk
    319             if markers is not None:

C:\Programme\Python26\lib\json\encoder.pyc in _iterencode_default(self, o, marke
rs)
    321
    322     def _iterencode_default(self, o, markers=None):
--> 323         newobj = self.default(o)
    324         return self._iterencode(newobj, markers)
    325

C:\Programme\Python26\lib\json\encoder.pyc in default(self, o)
    342
    343         """
--> 344         raise TypeError(repr(o) + " is not JSON serializable")
    345
    346     def encode(self, o):

TypeError: array('l', [0, 1, 2, 3, 4]) is not JSON serializable
Man müßte dafür dann erst einen Hook schreiben... da würde ich im Zweifel auch bei pickle bleiben.

Verfasst: Mittwoch 16. September 2009, 13:23
von lutz.horn
Ich habe keine Ahnung von numpy, aber was macht eigentlich array.tostring()? Reicht das nicht für die Serialisierung?

Verfasst: Mittwoch 16. September 2009, 13:30
von Hyperion
lutz.horn hat geschrieben:Ich habe keine Ahnung von numpy, aber was macht eigentlich array.tostring()? Reicht das nicht für die Serialisierung?
Stimmt. Jetzt sehe ich das auch :-)

array stellt also selber eine Serialisierung zur Verfügung. Also könnte man auch locker diese nutzen.

Allerdings hat der OP ja noch nicht explizit gesagt, was er nun nutzt! (also ob array aus numpy oder aus dem array-Modul der Standard-Lib)