Seite 1 von 1

Dateiinhalt in eine Liste

Verfasst: Mittwoch 25. November 2009, 18:21
von beuzel
Hallo,

Ich möchte eine sehr kleine Liste in einer Textdatei abspeichern und wieder laden. Bisher funktioniert Folgendes:

Code: Alles auswählen

a={'a':(2,4),'b':(4,5)}
file = open(fileName,"w")
file.write(str(aniClipRanges))
file.close()	
und zum Einlesen

Code: Alles auswählen

file = open(fileName,"r")
a = eval(file.read())
file.close()
Die Datei sieht dann ungefähr so aus:
{u'a': (2, 4), u'b': (4, 5)}

Nur werden alle Daten in eine Zeile geschrieben. Ich brauche aber EINE Zeile pro Eintrag. Also ist das Schreiben geändert in

Code: Alles auswählen

file = open(fileName,"w")
file.write("{\n")	
for clip in a.keys():
	s = "u'%s' : %s"%( clip, a[clip] )
	if clip != a.keys()[-1]:
		s+=",\n"
	file.write(s)
file.write("\n}\n")
file.close()

Die Datei sieht dann ungefähr so aus:
{
u'a': (2, 4),
u'b': (4, 5)
}

Doch beim Einlesen kommt immer eine Fehlermeldung bei eval(). Und zwar beim ersten Zeichen "{". Was kann ich tun?

Danke für Hilfe

Chris

Verfasst: Mittwoch 25. November 2009, 18:25
von EyDu
Hallo!

Schau dir mal das [mod]pickle[/mod]-Modul an, das scheint mir das zu sein, was du suchst. Noch ein paar Tips:

- Verwende nicht "file" als Name, damit überschreibst du einen built-in-Namen.
- Benutze auf keinen Fall "eval". Wenn du das brauchst, dann machst du mit Sicherheit etwas falsch.
- Ein Blick in PEP8 schadet vielleicht auch nicht.

Bis dann,
Sebastian

Verfasst: Mittwoch 25. November 2009, 18:56
von Hyperion
Oder json;-)

Verfasst: Mittwoch 25. November 2009, 18:57
von cofi
Um mal ein wenig auf den Datenstrukturen herumzureiten: Du benutzt ueberhaupt keine Liste sondern ein Dictionary von Tupeln.
`eval` "auf keinen Fall" zu benutzen is etwas hart, aber wenn man das verwenden will, sollte man sich 3mal ueberlegen, ob es nicht doch besser geht.

@Problem: Zum serialisieren hat die Stdlib noch mehr auf Lager: JSON, marshall usw.

Verfasst: Mittwoch 25. November 2009, 19:12
von lunar
Angesichts der Warnungen in der Dokumentation von marshal ist dessen Empfehlung verwunderlich, wenn man den Einsatz von "eval()" für bedenklich hält. Denn was für "eval()" gilt, trifft auch auf marshal zu:
The marshal module is not intended to be secure against erroneous or maliciously constructed data. Never unmarshal data received from an untrusted or unauthenticated source.

Verfasst: Mittwoch 25. November 2009, 19:55
von cofi
Das war keine Empfehlung, sondern eine Erwaehung der Vollstaendigkeit halber. Aber natuerlich hast du recht.