ubuntuusers.de

Python: Speichern von Benutzern - Configparser?

Status: Gelöst | Ubuntu-Version: Xubuntu 10.10 (Maverick Meerkat)
Antworten |

deadtronic

Anmeldungsdatum:
18. Februar 2010

Beiträge: 762

Ich habe folgenden Ansatz, um Benutzer mittels ConfigParser auszulesen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
self.config = ConfigParser.RawConfigParser()
self.config.read(CONFIG)
self.users = {}
for i in range(0, 100):
	try:
		user_list = []
		name = self.config.get('User%s' % i, 'name')
                ID = self.config.get('User%s' % i, 'id')
		user_list[0:1] = [name, ID]
		self.users[i] = user_list
	except ConfigParser.Error:
		break

Das Configfile ist dann so aufgebaut:

[User0]
name= weihnachtsmann
id = 0
[User1]
name= osterhase
id = 1
# ...

Das funktioniert an sich ja ganz gut, das Problem ist nur, wenn ein Benutzer gelöscht wird. Denn sobald ein User mittendrin nicht existiert, wird abgebrochen und angenommen, das keine weiteren existieren. Zwar könnte man die Schleife trotz Fehlern die 100x mal oder wie viel auch immer durchlaufen lassen, aber die feine Art ist das ja nicht gerade. Oder ich lasse nach jedem löschen das komplette Configfile neu erstellen, aber dann kann ich es auch grad von Hand parsen.

Hat einer Ratschläge, wie das besser geht?

Danke

Gruß
deadtronic

Yoschi

Anmeldungsdatum:
11. April 2009

Beiträge: 454

Hallo !

Musst du denn den ConfigParser verwenden ? Ich würd da eher XML nehmen (mal wieder ? 😉):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from xml.etree.ElementTree import ElementTree

parser = ElementTree()
self.users = []

parser.parse(CONFIG)

for i in parser.findall("users/user"):
    name = i.find("name").text
    ID = int(i.find("id").text)
    self.users += [[name, ID ]]

für eine XML Datei:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<config>
    <users>
        <user>
            <name>Weihnachtsmann</name>
            <id>0</id>
        </user>
        <user>
            <name>Osterhase</name>
            <id>1</id>
        </user>
    </users>
</config>

Für den ConfigParser bräuchtest du eine Möglichkeit durch alle Sektionen zu iterieren ... Es sei denn du machst sowas:

[Users]
user0: Weihnachtsmann
user1: Osterhase

Über die Werte kannst du ja mit items("Users") drüber ...

Yoschi

edit: Du könntest auch deine Config Datei auch vorher, wenn nötig, umformen, das würde aber den ganzen Sinn des ConfigParsers aufheben, weil du doch alles selbst einlesen musst ...

deadtronic

(Themenstarter)

Anmeldungsdatum:
18. Februar 2010

Beiträge: 762

Yoschi schrieb:

Hallo !

Musst du denn den ConfigParser verwenden ? Ich würd da eher XML nehmen (mal wieder ? 😉):

Nein, deshalb habe ich ja nachgefragt. 😉 XML geht vollkommen in Ordnung, soll ja nicht vom User editiert werden, ich bin nur einfach nicht auf die Idee gekommen.

Den Code versuche ich später dann mal einzubauen, dankeschön.

Gruß
deadtronic

Yoschi

Anmeldungsdatum:
11. April 2009

Beiträge: 454

XML hat halt den Vorteil, dass es noch recht gut editierbar ist ... Die einfachste Möglichkeit ist, wenn das wirklich nicht nötig ist Pickle, ein binäres Format um Python - Objekte in Dateien zu speichern:

1
2
3
4
5
import pickle

file = open(CONFIG, "r")
self.users = pickle.load(file)
file.close()

Zum Speichern einfach:

1
2
3
file = open(CONFIG, "w")
pickle.dump(self.users, file)
file.close()

Yoschi

deadtronic

(Themenstarter)

Anmeldungsdatum:
18. Februar 2010

Beiträge: 762

Yoschi schrieb:

XML hat halt den Vorteil, dass es noch recht gut editierbar ist ... Die einfachste Möglichkeit ist, wenn das wirklich nicht nötig ist Pickle, ein binäres Format um Python - Objekte in Dateien zu speichern

Es spricht nichts dagegen, wenn es editierbar ist, von daher werde ich wohl XML nehmen. So faul bin ich dann auch nicht. *g*

Gruß
deadtronic

DasIch

Avatar von DasIch

Anmeldungsdatum:
2. November 2005

Beiträge: 1130

Yoschi schrieb:

XML hat halt den Vorteil, dass es noch recht gut editierbar ist ...

Das ist jetzt nicht wirklich dein ernst? SGML wenn auch sehr ungewöhnlich geht ja noch aber XML? Ein eigener INI Parser der dass Format um Typen und Listen erweitert macht da mehr Sinn oder eben YAML.

deadtronic

(Themenstarter)

Anmeldungsdatum:
18. Februar 2010

Beiträge: 762

DasIch schrieb:

Yoschi schrieb:

XML hat halt den Vorteil, dass es noch recht gut editierbar ist ...

Das ist jetzt nicht wirklich dein ernst? SGML wenn auch sehr ungewöhnlich geht ja noch aber XML?

Ich denke, Yoschi meint das wohl vorallem im Vergleich zu Pickle. 😉

Ein eigener INI Parser der dass Format um Typen und Listen erweitert macht da mehr Sinn oder eben YAML.

Hmm aber YAML bzw. PyYAML muss erst nachinstalliert werden, d.h. eine Abhängigkeit die eigentlich nicht sein muss. Wenn es wirklich wichtig sein sollte, dass es editierbar ist, muss eben ein XML Editor verwendet werden, XML ist schließlich ein Standard.

Yoschi

Anmeldungsdatum:
11. April 2009

Beiträge: 454

Müsstest du nicht unbedingt. Wenn du nur einen Teil von YAML verwendest, kannst du json nehmen, eine echte Untermenge von YAML und in der Standardbibliothek. Wenn man aber schon so weit ist, kann man auch sagen, dass die String - Versionen von Pythons Dictonary und Array auch schon meistens JSON ist. (also einfach das Ergebnis von str(self.users) speichern; wenn nicht, ist ein json.dump(self.users) auch nicht "schlimmer") Zum Parsen dann aber lieber json.load(string) nehmen, nicht dass du dem Benutzer das Ausführen von beliebigen Code erlaubst.

deadtronic schrieb:

DasIch schrieb:

Yoschi schrieb:

XML hat halt den Vorteil, dass es noch recht gut editierbar ist ...

Das ist jetzt nicht wirklich dein ernst? SGML wenn auch sehr ungewöhnlich geht ja noch aber XML?

Ich denke, Yoschi meint das wohl vorallem im Vergleich zu Pickle. 😉

Ja, aber ich hätte wohl eher "lesbar" schreiben sollen ☺

Yoschi

Antworten |