Brauche kleine aber feine Lösung ;)

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Brauche kleine aber feine Lösung ;)

Beitragvon gerold » Dienstag 30. Januar 2007, 09:16

jens hat geschrieben:Sag mal, warum nutzt du nicht einfach SQlite? Ist bei Python ab 2.5 dabei. IMHO bist du auf den Weg eine eigene DB mit XML zu programmieren...

Hi Jens!

Ich sehe das anders. Es macht keinen Sinn, Daten in eine Datenbank zu kapseln, wenn nicht nach strukturierten Daten gesucht werden soll. Der Vorteil bei einer Datenbank ist, dass wenig Daten aus vielen Daten schnell gefunden werden können. Es handelt sich weder um viele Daten, noch müssen diese einzeln schnell gefunden werden. Dann kommen evt. noch Bilder dazu. Das sind alles Dinge, die in einer Datenbank nichts zu suchen haben. Dann müssen alle Daten aus der Datenbank wieder raus, wenn die Änderungen zum Server hochgeladen werden sollen. Warum nicht gleich alles in einzelnen Dateien verwalten und dann per FTP hochladen.

Wenn alles in einer Datenbank ist, dann müssen die einzelnen Daten wieder raus genommen werden, wenn diese von einem Fremdprogramm bearbeitet werden sollen. Wenn die HTML-Strings als Dateien vorliegen, dann kann jedes Programm direkt darauf zugreifen. So lässt sich das Programm sehr leicht erweitern.

XML ist ein anerkannter Standard für den Datenaustausch. Es gibt keine erfolgreiche Programmiersprache auf dieser Welt, mit der man nicht XML parsen, erstellen, umwandeln oder validieren könnte. XML wurde nun mal dazu ausgewählt, das Universal-Datenaustauschformat zu sein. Es gibt natürlich auch einfachere Formate. Aber du suchst vergeblich z.B. nach einen YAML- oder JSON-Parser für Visual Basic 6. INI ist grade mal so drinn, wenn du die Windows-API (z.B. ``GetPrivateProfileString``) heran ziehst.

Außerdem lässt sich mit ElementTree XML wirklich einfach erstellen und auch wieder auslesen. Ich weiß noch, wie schwer es mit Visual Basic 6 war. ElementTree ist ab Python 2.5 mit dabei. Es lässt sich auch ohne Probleme mit cx_freeze oder py2exe in das zu verteilende Programmpaket einpacken. OK, das ist bei SQLite auch so einfach. :-)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import elementtree.ElementTree as et


#----------------------------------------
# Schreiben
#----------------------------------------
# Root-Tag
root_tag = et.Element("ROOT")

# Files-Tag
files_tag = et.SubElement(root_tag, "FILES")

# Mehrere Files
file_tag = et.SubElement(files_tag, "FILE")
file_tag.set("name", "dateiname1.txt")
file_tag = et.SubElement(files_tag, "FILE")
file_tag.set("name", "dateiname2.txt")
file_tag = et.SubElement(files_tag, "FILE")
file_tag.set("name", "dateiname3.txt")
file_tag.text = "Hallo Welt"

# Speichern
f = file("test.xml", "w")
etree = et.ElementTree(root_tag)
etree.write(f, "iso-8859-1")
f.close()


#----------------------------------------
# Lesen
#----------------------------------------
f = file("test.xml", "r")
etree = et.parse(f)
f.close()
root_tag = etree.getroot()
files_tag = root_tag.find("FILES")
if files_tag:
    for file_tag in files_tag.findall("FILE"):
        print file_tag.get("name")
        print "  " + (file_tag.text or "")

lg
Gerold
:-)
Zuletzt geändert von gerold am Dienstag 30. Januar 2007, 09:23, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Dienstag 30. Januar 2007, 09:20

Wie gesagt. Ich benötige etwas, was möglichst NICHT an irgentwelche Installationen gebunden ist.

Es soll möglichst portabel sein. Das ist mein Hauptgrund, weswegen ich gerne auf die "normalen" Datenbanken verzichten würde.


Und so lange ich in meine "Datenbankinterpretation" (was ich noch lang nicht so bezeichnen würde) nicht auch noch SQL als Verbindungssprache benutze find ich das schon i.o :)

Des weiteren zieht bei mir das Argument, das es in Python 2.5 drinne ist nicht so ganz :) -- erst, wenn du mir den ersten Hoster zeigst, der das anbietet :'(


Also um möglichst Portabel zu sein ist eine kleine sehr abgespeckte selbst "entwickelte" Lösung schon nicht schlecht.


Ich werde mal schaun, was ich so hinbekomme.


MfG EnTeQuAk


EDIT: da war Gerold schneller ;) -- schaut übrigens gut aus, dein Script'chen' :) Danke!
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 30. Januar 2007, 09:24

EnTeQuAk hat geschrieben:Des weiteren zieht bei mir das Argument, das es in Python 2.5 drinne ist nicht so ganz :) -- erst, wenn du mir den ersten Hoster zeigst, der das anbietet :'(

Dann müsstest du allerdings auch auf ElementTree verzichten...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Dienstag 30. Januar 2007, 09:27

Wobei ElementTree einfach ein Modul ist, das ich meinem Programm beipacken kann. Ich rede nicht von den python-SQLite Modulen 'pqsqlite' usw. ich muss doch (wenn ich nicht komplett falsch liege) auch SQLite ansich installieren (genau wie bei MySQL und PostgreSQL)...


MfG EnTeQuAk
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 30. Januar 2007, 09:28

...fast hätte ich es vergessen.

ElementTree ist eine reine Python-Lösung. Es ist also einfach nur der Ordner "elementtree" mit in das Programm aufzunehmen. Keine Installation nötig.

lg
Gerold
:-)

Edit: OK, das wusstest du schon. :-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Dienstag 30. Januar 2007, 09:43

Edit: OK, das wusstest du schon.


Bin ja nicht von vorgesern :)


Ich habe mir gerade noch ein paar Tutorials zu Python und XML angeschaut... SAX -- zu groß... DOM --- zu groß... ElementTree :) PASSEND! :) :)


btw. du hast öfters XMLRPC erwähnt, als eine Möglichkeit Daten auszutauschen zwischen Client und Server. Was steckt dahinter? -- Was genau ist so ein XML-RPC Server? -- Wie werden dort die Daten übertragen?


MfG EnTeQuAk
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 30. Januar 2007, 10:15

EnTeQuAk hat geschrieben:btw. du hast öfters XMLRPC erwähnt, als eine Möglichkeit Daten auszutauschen zwischen Client und Server. Was steckt dahinter? -- Was genau ist so ein XML-RPC Server? -- Wie werden dort die Daten übertragen?

Hi EnTeQuAk!

Das ist in Python so ziemlich die einfachste Möglichkeit, Daten zwischen einem Serverprogramm und einem Clientprogramm auszutauschen. Der Datenaustausch läuft über das zustandslose HTTP-Protokoll. Das heißt, dass du vom Client aus Funktionen auf dem Server aufrufen kannst. Dann bekommst du vom Server irgendwelche Daten zurück. Du kannst aber nicht vom Server aus eine Funktion auf dem Client ausführen. Dafür bräuchtest du zusächlich eine Verbindung in die entgegengesetzte Richtung. Da das aber fast nie gebraucht wird, ist XMLRPC so ziemlich das einfachste was es unter Python gibt.

http://www.python-forum.de/topic-5478.html

Wenn du z.B. Text vom Client zum Server übertragen möchtest, dann schreibst du auf dem Server eine Funktion, die einen Text als Argument entgegen nehmen kann. Vom Client aus rufst du diese Funktion mit dem entsprechenden Argument auf.

Da das Protokoll sehr einfach ist, bist du auf die einfachen Datentypen (str, int, float, tupple, list, dictionary) eingeschränkt. Du kannst aber auch Binärdaten übertragen lassen.
Diese Binärdaten kannst du z.B. so ``xmlrpclib.Binary("ich bin binaer")`` in einen übertragbaren String umwandeln und als Argument übergeben. Der Empfänger bekommt die Binärdaten über das Attribut ``data`` wieder aus dem Container raus.

- http://docs.python.org/lib/module-xmlrpclib.html
- http://docs.python.org/lib/module-Simpl ... erver.html

Man muss nicht einmal den XMLRPC-Server laufen lassen. Man kann einen XMLRPC-Handler auch von einem CGI-Programm aus aufrufen. So lässt sich XMLRPC auch dann verwenden, wenn nur Port 80 zur Verfügung steht. Man lässt den Apachen "servieren" und ein CGI-Skript beantwortet die GET- oder POST-Anfrage mit gültigem XMLRPC. Der Apache gibt das Ganze dann per HTTP wieder zurück. Die Daten sind in eine XML-Struktur eingepackt.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Dienstag 30. Januar 2007, 10:28

DAS werde ich auch mal ausprobieren ;) vllt. ist das im Enddefekt einfacher, als das ganze via FTP zu übertragen. Mal schauen :D :D

Herzlichen Dank nochmal an dich Gerold, der du mir wiedermal eine neue Welt gezeigt hast :)

Und an alle andere, die hier mitgemacht haben :D
tomate
User
Beiträge: 48
Registriert: Sonntag 5. August 2007, 12:07

Beitragvon tomate » Samstag 3. November 2007, 15:02

Moin!
Ich kriege folgende Fehlermeldungen beim Einlesen der XML-Datei:


etree = parse(file)
File "E:\Programme\Python25\Lib\xml\etree\ElementTree.py", line 862, in parse
tree.parse(source, parser)
File "E:\Programme\Python25\Lib\xml\etree\ElementTree.py", line 579, in parse
source = open(source, "rb")
IOError: [Errno 2] No such file or directory: '<?xml version="1.0" ?>\n<events>\n <event>\n <datetime>\n 01.01.2001 12:00:01\n </datetime>\n <priority>\n

...


Als XML-Datei habe ich folgendes Beispielvon Y0Gi genommen:
<?xml version="1.0" ?>
<events>
<event>
<datetime>
01.01.2001 12:00:01
</datetime>
<priority>
1
</priority>
<message>
Event #1 has occured.
</message>
</event>
...


Der Code sieht wie folgt aus:


Code: Alles auswählen

        #Einlesen
        dlg = wx.FileDialog(self, "Datei öffnen", self.dirname, "", "*.*", wx.OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            self.filename=dlg.GetFilename()
            self.dirname=dlg.GetDirectory()
            f=open(os.path.join(self.dirname, self.filename),'r')
            self.data = f.read()
            f.close()
        dlg.Destroy()
       
        self.readXmlFile(self.data)

und

Code: Alles auswählen

from xml.etree.ElementTree import Element, SubElement, tostring, parse

def readXmlFile(file):
    etree = parse(file)
    root_tag = etree.getroot()


Was mache ich falsch?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Samstag 3. November 2007, 15:39

Einiges! Du übergibst nämlich den Inhalt der XML-Datei als Dateinamen an ``ElementTree.parse()`` :)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder