Array abspoeichern

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
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

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
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

shelve kann das, hat aber ein paar Eigenheiten...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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``
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

shelve erzeugt gepicklete dict-ähnliche Objekte - das ist nicht dasselbe wie ein array picklen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

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
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

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]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Ich habe keine Ahnung von numpy, aber was macht eigentlich array.tostring()? Reicht das nicht für die Serialisierung?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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)
Antworten