Seite 1 von 1

Speichern und laden?

Verfasst: Dienstag 28. Juni 2005, 17:41
von Hannes99
Hallo,

wie kann ich unter Python z.b. eine Liste in ein Textdokument speicher und es dann später und in einer anderen Python-Datei wieder laden und damit weiterarbeiten?

Verfasst: Dienstag 28. Juni 2005, 18:13
von Leonidas
Das ist mit YAML (habe damit gute Erfahrungen gemacht) oder JSON überhaupt kein Problem.

Verfasst: Dienstag 28. Juni 2005, 19:32
von Olliminatore
Sehr interessant Leonidas.

Ich habe das mal so gemacht:

Code: Alles auswählen

Line=0
Data[Line]=[repr(Liste)+'\n']    #list to string
f = open('Textdokument', 'w+')
f.writelines(Data) 
f.close()

#-- other Modul --
Data = open('Textdokument', 'r+').readlines()
ListData = Data.pop(Line)
Liste = eval(ListData.rstrip('\n'))    #string to list 
Der String wird wieder zu einer echten Liste umgewandelt.

Verfasst: Dienstag 28. Juni 2005, 20:17
von Hannes99
Olliminatore hat geschrieben:Sehr interessant Leonidas.

Ich habe das mal so gemacht:

Code: Alles auswählen

Line=0
Data[Line]=[repr(Liste)+'\n']    #list to string
f = open('Textdokument', 'w+')
f.writelines(Data) 
f.close()

#-- other Modul --
Data = open('Textdokument', 'r+').readlines()
ListData = Data.pop(Line)
Liste = eval(ListData.rstrip('\n'))    #string to list 
Der String wird wieder zu einer echten Liste umgewandelt.


Hallo.
Vielen Dank erstmal, aber ich verstehe deinen Vorschlag noch nicht so ganz...

Verfasst: Dienstag 28. Juni 2005, 20:53
von Olliminatore
Oh* habe einen kleinen Fehler eingebaut.
Da Data "auch" schon eine Liste ist, muss Zeile 2 so aussehen:

Code: Alles auswählen

Data[Line]=repr(Liste)+'\n'    #list to string
Du kannst es auch ohne writelines(), readlines() machen, im Prinzip wollte ich nur ein Beispiel mit repr(), eval() darstellen.

Verfasst: Dienstag 28. Juni 2005, 21:55
von BlackJack
Und das `eval()` vergessen wir jetzt ganz schnell wieder, weil es in diesem einfachen Fall eine unnötige Sicherheitslücke darstellt. Man stelle sich nur einmal vor die Textdatei enthält folgendes:

Code: Alles auswählen

import os
os.system(os.path.expanduser('rm -rf ~'))
Oder einen entsprechend verheerenden Befehl für Windows/MacOS/...

Wenn die Daten komplexer werden und keine Interoperabilität mit anderen Programmen bzw. Programmiersprachen bestehen muss, dann ist das `pickle` Modul wohl die einfachste Lösung Daten auf die Platte rauszuschreiben und später wieder einzulesen ohne sich um das Format kümmern zu müssen. (Nicht vegessen die Dateien immer als Binärdateien zu öffnen!)

Verfasst: Mittwoch 29. Juni 2005, 10:46
von Olliminatore
:shock: Ich denke eval() hat ein Recht nicht vergessen zu werden.
Aber einverstanden. :mrgreen: *pickle studier*

Verfasst: Mittwoch 29. Juni 2005, 15:10
von jAN
hi hannes!
pickle ist ein sehr schones modul zum speichern von daten
man erzeugt einen Pickler()
und mit dem kann man dann in die datei schreiben (dump)

Code: Alles auswählen

from pickle import *
f=file(path,'w')
p=Pickler(f)
p.dump(data)
f.close()
und zum entpacken:

Code: Alles auswählen

from pickle import *
f=file(path,'w')
p=Unpickler(f)
data=p.load()
f.close()
es gibt auch cPickle
das ist komplett in C geschrieben und deutlich schneller
gruß jAN

Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Mittwoch 29. Juni 2005, 15:17
von jens
Wobei es geht auch so:

Code: Alles auswählen

import pickle

f=file(path,'w')
f.write( pickle.dumps(daten) )
f.close()

Code: Alles auswählen

import pickle

f=file(path,'r')
daten = pickle.loads( f.read() )
f.close()
Ist es dabei wirklich wichtig die Datei im Binary Modus zu öffnen??? Ich denke nicht, da es ja serialisierter Text ist, oder?

Verfasst: Mittwoch 29. Juni 2005, 19:45
von Leonidas
jens hat geschrieben:Ist es dabei wirklich wichtig die Datei im Binary Modus zu öffnen??? Ich denke nicht, da es ja serialisierter Text ist, oder?
Nein, nur Protokoll 0, die Protokolle 1 & 2 sind binär.

Deswegen wenn ich etwas dumpen oder laden möchte, das der User bearbeiten kann, nehme ich YAML/JSON.

Edit: Da alle hier Code posten mache ich mit:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import yaml
filename = 'textdump.yaml'

def dump(obj):
    f = file(filename, 'w')
    d = yaml.dump(obj)
    f.write(d)
    f.close()

def load():
    obj = yaml.loadFile(filename)
    for item in obj:
        return item

def main():
    daten = {'Eine Liste' : ['a', 'b', 'c'],
        'In einem Dict' : 'finde ich sehr praktisch'}
    print daten
    dump(daten)
    print load()

if __name__ == '__main__':
    main()
generiert folgende Datei:

Code: Alles auswählen

---
Eine Liste:
    - a
    - b
    - c
In einem Dict: finde ich sehr praktisch

Verfasst: Mittwoch 29. Juni 2005, 20:17
von Hannes99
Vielen Dank euch allen.
Ich werde alles ausprobieren :) und schauen, welches in mein Projekt am besten passt :)

Echt klasse dieses Forum, man bekommt immer Hilfe, auch als Anfänger.

Verfasst: Mittwoch 29. Juni 2005, 21:24
von BlackJack
Leonidas hat geschrieben:
jens hat geschrieben:Ist es dabei wirklich wichtig die Datei im Binary Modus zu öffnen??? Ich denke nicht, da es ja serialisierter Text ist, oder?
Nein, nur Protokoll 0, die Protokolle 1 & 2 sind binär.
Das Protokoll 0 ist etwas unglücklich als "Text" benannt -- auch das ist binär! Die Daten müssen ohne Veränderungen durch das Betriebssystem geschrieben und gelesen werden wenn sie unter Plattformen austauschbar sein sollen. Und das geht bei Text nicht, weil Windows zum Beispiel aus einem einzelnen '\n' beim Schreiben von Textdateien '\r\n' macht. Das lässt sich dann zwar unter Windows auch wieder lesen, aber unter MacOS und Linux nicht.