Hallo, zusammen!
Eines vorweg: Ich bin ein absoluter Neuling in Pyton, möchte es aber lernen.
Ich habe derzeit ein Program, welches ich mit der Hilfe eines andern Forums (da spezielles Modul für die InSim Programmierung eines Computerspiels) auch lauffähig erstellen konnte.
Nun habe ich aber folgendes Problem:
Das Programm verbindet sich mit allen in einem Dictionary angegebenen Servern ({port: IP, port: IP.....}) und führt dann die entsprechenden Aktionen aus.
Nun möchte ich das Programm aber weitergeben und dies soll in einer EXE geschehen, damit der Endanwender kein Python installiert haben muss.
Damit das Programm aber konfigurierbar bleibt, möchte ich das Dictionary aus einer Knfigurationsdatei einlesen...
Doch da komme ich nicht weiter Die Methode mit file.readlines gibt mir ja nur eine Liste - und kein Dictionary... So müsste ich dann ja aus 2 Dateien einmal die Ports und dann die IPs einlesen und diese dann in ein Dictionary zusammensetzten...
Kann mir da jemad weiterhelfen, wich ich es bewerkstelligen kann, das ich eine leicht konfigurierbare txt datei habe, aus der ich dann die Daten als Dictionary auslesen kann? Die Prickel Variante (die haben ich nur in einem ganz kurzen Überbick gesehen) nutzt ja txt Dateien, die nicht so ganz einfach editierbar sind...
Vielen Dank schonmal!
Dictionary aus anderen Datei einlesen..
"Prickel" ist gut!
Aus deiner Ablehung von pickle schließe ich, DASS du die Dateien auch durch andere Programme oder per Hand editieren willst. Wenn nicht: Nimm doch pickle.
Ansonsten ist es eher eine Frage, wie du die Daten in der txt-Datei ablegst.
Wenn du sie zeilenweise als Zeichenkette "port:IP" abspeicherst, kannst du sie zeilenweise wieder einlesen, am ":" splitten und in ein Dictionary stecken.
Aus deiner Ablehung von pickle schließe ich, DASS du die Dateien auch durch andere Programme oder per Hand editieren willst. Wenn nicht: Nimm doch pickle.
Ansonsten ist es eher eine Frage, wie du die Daten in der txt-Datei ablegst.
Wenn du sie zeilenweise als Zeichenkette "port:IP" abspeicherst, kannst du sie zeilenweise wieder einlesen, am ":" splitten und in ein Dictionary stecken.
Wenn du ein Modul suchst, um Konfigurationsdateien zu erstellen/lesen/ändern, dann guck dir mal ConfigParser an.Crady hat geschrieben: Damit das Programm aber konfigurierbar bleibt, möchte ich das Dictionary aus einer Knfigurationsdatei einlesen...
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Oder ConfigObj
Bastelt/liest wie ConfigParser .ini-Konfigurationsdateien.
Bastelt/liest wie ConfigParser .ini-Konfigurationsdateien.
Hallo, zusammen!
vielen Dank erstmal für die Antworten
Zu Prickel: Ja, das Problem ist, dass das Konfigurationsfile händisch editiert werden soll.
Mit ConfigParser habe ich das Problem, dass ich nur einen String auslesen kann und somit keine "port:IP" Kompination in einem Dictionary bekomme, die ich dann zum verbinden mit den Servern auslesen kann.
Mit ConfigObj komme ich leider irgendwie nicht zurecht...
Also habe ich versucht, das textfile zeilenweise einzulesen, dann die "port:IP" Kombination zu teilen um sie dann ins dictionary zu schreiben.
Das funktioniert auch ganz gut... ABER: Leider habe ich hinter der IP immer noch den Zeilenschalter "/n"... Ich kann hier jetzt leider nicht testen, ob er einfach ignoriert wird und es trotzem geht... Oder kann ich den noch irgendwie weglöschen?
Hier mein Code soweit:
Und das ist dann die Ausgabe:
{'29998': '127.0.0.1', '29999': '127.0.0.1\n'}
vielen Dank erstmal für die Antworten
Zu Prickel: Ja, das Problem ist, dass das Konfigurationsfile händisch editiert werden soll.
Mit ConfigParser habe ich das Problem, dass ich nur einen String auslesen kann und somit keine "port:IP" Kompination in einem Dictionary bekomme, die ich dann zum verbinden mit den Servern auslesen kann.
Mit ConfigObj komme ich leider irgendwie nicht zurecht...
Also habe ich versucht, das textfile zeilenweise einzulesen, dann die "port:IP" Kombination zu teilen um sie dann ins dictionary zu schreiben.
Das funktioniert auch ganz gut... ABER: Leider habe ich hinter der IP immer noch den Zeilenschalter "/n"... Ich kann hier jetzt leider nicht testen, ob er einfach ignoriert wird und es trotzem geht... Oder kann ich den noch irgendwie weglöschen?
Hier mein Code soweit:
Code: Alles auswählen
# Load Hostfile
hostlist = {}
hostfile = file('Hosts.TXT')
server = hostfile.readline()
while server:
hostlist[server.partition(':')[0]]=server.partition(':')[2]
server = hostfile.readline()
hostfile.close()
print hostlist
{'29998': '127.0.0.1', '29999': '127.0.0.1\n'}
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Code: Alles auswählen
" ".strip()
Zu ConfigParser: Du hast Key und Value Paare in einer Konfigurationsdatei. Was ist ein Dictionary? Du musst dich ja nicht an die Syntax für Dictionary-Literale halten.
ConfigObj ist im Prinzip das gleiche wie ConfigParser nur ne Nummer größer.
Wenn die Datei händisch editierbar sein soll, dann würde ich dir allerdings zu den Config* raten. Das Format ist schliesslich bekannt (und sogar standardisiert )
P.S. Es heisst Pickle nicht Prickle.
Sollte sich zB einfach mit JSON machen lassen..Crady hat geschrieben: Damit das Programm aber konfigurierbar bleibt, möchte ich das Dictionary aus einer Knfigurationsdatei einlesen...
PS. aber immer prüfen, was man ausführt
Danke, cofi! So scheint es zu gehen:
muss ich nun morgen in der Testumgebung noch ausprobieren - sollte aber klappen...
Code: Alles auswählen
# Load Hostfile
hostlist = {}
hostfile = file('Hosts.TXT')
server = hostfile.readline()
while server:
serv = server.strip(':\n')
hostlist[serv.partition(':')[0]]=serv.partition(':')[2]
server = hostfile.readline()
hostfile.close()
print hostlist
Das ist aber ziemlich umständlich. Eine Zeile hätte es auch getan ...
Wandelt hosts.txt mit dem Inhalt
um in
Ja, man sollte die Datei noch schließen.
Code: Alles auswählen
hostdict = dict([zeile.strip().split(":") for zeile in open("hosts.txt","r")])
Code: Alles auswählen
port1:IP1
port2:IP2
port3:IP3
port4:IP4
port5:IP5
Code: Alles auswählen
{'port4': 'IP4', 'port5': 'IP5', 'port2': 'IP2', 'port3': 'IP3', 'port1': 'IP1'}
Ohne das Rad neu zu erfinden gehts auch so:
Ist vielleicht hier nicht unbedingt nötig, aber das ist nunmal ein CSV Format. Grade beim Zugriff auf Dateien sollte man sich nicht selbst irgendwas zurechtschnipseln, imho. Außerdem ist das leicht erweiterbar.
Code: Alles auswählen
>>> from __future__ import with_statement
>>> import csv
>>> with open("hosts.txt", "rb") as file_obj:
... new_dict = dict(row for row in csv.reader(file_obj, delimiter=":"))
...
>>> new_dict
{'port4': 'IP4', 'port5': 'IP5', 'port2': 'IP2', 'port3': 'IP3', 'port1': 'IP1'}
>>>
Naja, das hängt aber auch davon ab, wie vertraut man mit den entsprechenden Modulen ist. Ich z.B. habe das csv-Modul noch nie benötigt, weiß nicht mehr darüber als dass es das gibt. Im vorliegenden Fall ist der Code zur Problemlösung (meine Fassung) in geschätzten 2 min fertig. Da empfindet man keine besondere Drang oder Notwendigkeit, sich zuvor mit einem neuen Modul zu beschäftigen.str1442 hat geschrieben:Ist vielleicht hier nicht unbedingt nötig, aber das ist nunmal ein CSV Format. Grade beim Zugriff auf Dateien sollte man sich nicht selbst irgendwas zurechtschnipseln, imho. Außerdem ist das leicht erweiterbar.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ich finde CSV auch zum Editiere für Nutzer eine Zumutung. Das ist nett für Übergabe von Daten, aber für Konfigurationen würde ich ConfigParser jederzeit vorziehen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
@Leonidas
Naja, per Editor und mit langen Zeilen schon, ist ja auch ein "Barebone" Format. Allerdings kann man zb auch OpenOffice Calc / Excel (wobei excel Microsoft mässig gern mal Mist zu bauen scheint) verwenden.
ConfigParser allerdings erfordert zwingend eine Sektion, die ja hier nicht gegeben ist. Könnte man "Hosts" nennen, wäre aber redundant.
@Numerix: Klar, deswegen habe ich ja drauf hingewiesen
Naja, per Editor und mit langen Zeilen schon, ist ja auch ein "Barebone" Format. Allerdings kann man zb auch OpenOffice Calc / Excel (wobei excel Microsoft mässig gern mal Mist zu bauen scheint) verwenden.
ConfigParser allerdings erfordert zwingend eine Sektion, die ja hier nicht gegeben ist. Könnte man "Hosts" nennen, wäre aber redundant.
@Numerix: Klar, deswegen habe ich ja drauf hingewiesen
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Es ist aber eindeutig eine Konfigurationsdatei. Editierst du Konfigurationsdateien in Excel? Ist auch schlechter geeignet für Versionskontrolle etc.str1442 hat geschrieben:Naja, per Editor und mit langen Zeilen schon, ist ja auch ein "Barebone" Format. Allerdings kann man zb auch OpenOffice Calc / Excel (wobei excel Microsoft mässig gern mal Mist zu bauen scheint) verwenden.)
In dem Fall etwas, aber spätestens wenn weitere Parameter festgelegt werden sollen wird es nötig und daher halte ich es im Hinblick auf leichte Erweiterbarkeit akzeptabel. Eine Section hinzuzufügen ist definitiv weniger Overhead, als etwa XML vorschreibt.str1442 hat geschrieben:ConfigParser allerdings erfordert zwingend eine Sektion, die ja hier nicht gegeben ist. Könnte man "Hosts" nennen, wäre aber redundant.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Kommt auf die Konfigurationsdatei an. Im hier vorliegenden Fall geht es ja nicht primär um Konfiguration, sondern um eine Zuordnung. Soll zwar auch von Hand editierbar sein, ist aber primär imho keine Konfiguration, denn Konfigurationen haben typischerweise keine Auflistungen, sonderen statische Namen, deren Wert man entsprechend setzt. Insofern verwende ich csv für Konfigurationen auch nicht. Konfigurationsdateien an sich sollten natürlich per Editor bearbeitbar sein, und solange die Zeilen einer csv Datei recht kurz bleiben, geht das auch.
Schlechter bei der Versionskontrolle: Das einzige was mir da einfallen würde wären recht lange "diff" Zeilen, aber XML und co sehen da auch nicht so schön aus.
Schlechter bei der Versionskontrolle: Das einzige was mir da einfallen würde wären recht lange "diff" Zeilen, aber XML und co sehen da auch nicht so schön aus.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ich bin mir nicht sicher, ob CSV dir die Reihenfolge der Einträge garantiert, also kann es da auch dazu kommen, dass die Datei komplett umsortiert wird, was bei Diffs eher blöd aussieht.str1442 hat geschrieben:Schlechter bei der Versionskontrolle: Das einzige was mir da einfallen würde wären recht lange "diff" Zeilen, aber XML und co sehen da auch nicht so schön aus.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Das CSV Modul funktioniert per Generator und gibt einem die Einträge von Anfang bis Ende linear zurück. Ansonsten dürfte es da eher keine Umsortierungen geben. Im Gegenteil, wenn man eine CSV Datei mit OpenOffice Calc editiert, werden die einzelnen Spalten ja auch geordnet dargestellt. Und per Editor funktionierts auch.
Vielen Dank, Euch allen!
Also meine Version - oder eben die Kompakte von Numerix funktionieren ganz gut...
Muss nur den Port noch in eine Integer wandeln, da ich mich mit einem String nicht verbinden kann.
@Leonidas: (Edit...)
Der ConfigParser ist zwar ganz schön - wenn man nur einen Wert braucht... Wenn ich in meiner Config.ini z.B. eingebe:
Dann kann ich das (in meinen Versuchen jedenfalls) nur als einen kompletten String auslesen - nicht als Dictionary...
Wenn ich z.B.
Auslese und dann in einer FOR Schleife drucke bekomme ich:
Statt:
Naja... wie dem auch sei, DIESES Problem ist nun erstmal gelöst
Nun mache ich mich mal an einen GUI für die Eingaben... da muss ich aber noch was in meinem Viseo2Brain ansehen bzw. mein Buch weiterlesen
Also meine Version - oder eben die Kompakte von Numerix funktionieren ganz gut...
Muss nur den Port noch in eine Integer wandeln, da ich mich mit einem String nicht verbinden kann.
@Leonidas: (Edit...)
Der ConfigParser ist zwar ganz schön - wenn man nur einen Wert braucht... Wenn ich in meiner Config.ini z.B. eingebe:
Code: Alles auswählen
[Hosts]
Hosts = {port:'IP', port:'IP',....,port:'IP'}
Wenn ich z.B.
Code: Alles auswählen
[Namen]
Namen: Hans, Peter, Uwe
Code: Alles auswählen
H
a
n
s
,
P
e
t
e
r
,
U
w
e
Code: Alles auswählen
Hans
Peter
Uwe
Nun mache ich mich mal an einen GUI für die Eingaben... da muss ich aber noch was in meinem Viseo2Brain ansehen bzw. mein Buch weiterlesen
Zuletzt geändert von Crady am Sonntag 2. November 2008, 16:17, insgesamt 1-mal geändert.