Python serialisera alla objekt i en array.

Permalänk
Medlem

Python serialisera alla objekt i en array.

Hej

jag har en array som innehåller objekt. Jag vill kunna spara den här listan till en fil. Tänker mig att man serialiserar objekten i listan
och sen sparar dom till en fil. har försökt göra detta med pickle men får det inte riktigt att fungera.

OBS: ren testkod

import pickle lista1 = [] lista2 = [] class Cykel: def __init__(self,_modell): self.modell = _modell def Ladda(): filvag = open('temp','rb') lista2 = pickle.load(filvag) def Spara(): filvag = open('temp','wb') pickle.dump(lista1,filvag) C = Cykel("BMX") lista1.append(C) Spara() Ladda() cyk = lista2[0] print(cyk.modell)

Får det här felet när jag försöker köra koden:
"Traceback (most recent call last):
File "C:/Python32/testpickle.py", line 23, in <module>
cyk = lista2[0]
IndexError: list index out of range"

någon som ser vad jag gör för fel?

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | Dell S2721DGFA | Asus MG279Q |

Permalänk
Medlem

Det finns inget på plats 0 i arrayn lista2?! (hint IndexError: list index out of range")

Permalänk
Medlem

ah precis men det borde det ju göra om det fungerat som det var tänkt. Vilket betyder att jag gjort något fel antingen när jag sparar listan eller när jag "laddar den.

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | Dell S2721DGFA | Asus MG279Q |

Permalänk
Medlem

som du sa så är det antingen problem med Spara() eller Ladda().
Hur ser filen ut, har Spara() skrivit något i den?

Inte själv testat att pickla en array iof, kanske måste loopa igenom arrayen och spara varje objekt till en string (dvs använda pickle.dumps ist) och spara hela kalaset till en fil sen. Bara en tanke.

Visa signatur

-- Arkade --

Permalänk
Medlem

lista2 i Ladda används inte, det är därför den är tom när du försöker hämta ut första elementet. Prova något i stil med:

import pickle class Cykel: def __init__(self, _modell): self.modell = _modell def Ladda(): filvag = open('temp', 'rb') return pickle.load(filvag) def Spara(): filvag = open('temp', 'wb') pickle.dump(lista1, filvag) if __name__ == '__main__': lista1 = [] C = Cykel("BMX") lista1.append(C) Spara() lista2 = Ladda() cyk = lista2[0] print(cyk.modell)

Edit: Kanske inte förklarade varför det är så att lista2 inte används. Det är pga pythons lite underliga variable scope. Om du jämför följande två exempel så kommer du förmodligen inse varför det är så att lista2 är tom efter att du köra Ladda()

def foo(): global a a = 1 if __name__ == '__main__': a = 0 print a foo() print a

Skriver ut:
0
1

def foo(): a = 1 if __name__ == '__main__': a = 0 print a foo() print a

Skriver ut:
0
0

Variable scope
Permalänk
Medlem
Skrivet av Psyence:

Tack! det fungerade. har kodat endel i c++ och c# men är helt färsk med python så uppskattar att du förklarade

tack till er andra som också svarade i tråden

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | Dell S2721DGFA | Asus MG279Q |