Strategie zum Einlesen eines flat-files / regexp

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Nachdem ich gemerkt habe, dass es ungünstig ist, Markup/HTML in XML zu speichern, möchte ich nun ein noch einfacheres Format benutzen.
Leider bekomm ich das nicht hin:

Code: Alles auswählen

import re
data = """text=hallo

newline
nochwas=sdsd

ui
"""

p = re.compile(r'^(\w+)=(.*?)', re.MULTILINE | re.DOTALL)
s = p.findall(data)
print s
>>[('text', ''), ('nochwas', '')]
# soll sein:
# [('text', 'hallo\n\nnewline'), ('nochwas', 'sdsd\n\nui')]
Aber vielleicht gibt es ja sowieso ein wesentlich besseres Verfahren?
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Du könntest CSV oder das Konfigurationsdateienformat (*.ini) verwenden, sieht nachdem aus, was du suchst. Siehe Standardbilbiothek.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wie wäre es mit dieser Syntax?

Code: Alles auswählen

text = """hallo

newline"""
nochwas = 'sdsd'

# ui
Der "Zufall" will es, dass dies valides Python ist, was du dann einfach mit `exec` einlesen und zu einem Dictionary machen kannst. Oder du benutzt `__import__()` oder `import`, um eine entsprechende Datei als Modul zu laden und dann das Modul wie ein Dictionay. Nutze doch einfach Python selbst für die Konfiguration.

Code: Alles auswählen

config = {}
exec read("config.py") in config
print config
Stefan
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Hmm, das klingt für mich ziemlich gefährlich.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Das ist glaube ich alles zeilenbasiert, oder?

Die Doku ist nicht erreichbar:
http://python.org/doc/current/lib/modul ... arser.html

Zum regulären Ausdruck habe ich hier ein ähnliches Problem gefunden:
http://social.msdn.microsoft.com/Forums ... 9c53e65776

Es geht um "positive lookahead". Leider sagt mir das nicht soviel.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

kann man module dynamisch importieren? das wäre natürlich eine einfache lösung. aber ich glaube ich möchte lieber reinen text.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Ha, ich habe den Code aus dem Link etwas umgebaut, so geht's:

Code: Alles auswählen

p = re.compile(r'''	^                           # Beginning of the line
					 (?P<Key>[^=]*?)             # Any text before the =, matched few as possible
					 (?:=)                      # Get the = now
					 (?P<Value>[^=\[]*)          # Get everything that is not an =
					 (?=^[^=]*?=|\Z)         # Look Ahead, Capture but don't consume
					''', re.MULTILINE | re.DOTALL | re.VERBOSE)
Da sind allerdings noch ein paar überflüssige Klammern drin.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Was genau hast du vor? Wenn du Text auszeichnen und am Ende (mindestens) XHTML heraus bekommen möchtest, kann ich dir nur allerwärmstens das docutils-Paket und reST (reStructuredText) ans Herz legen. Die Syntax ist einfach zu schreiben und zu erweitern und in der Python-Community sehr verbreitet (wird u. a. für die neue Python-Dokumentation verwendet).
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Hi,

mein Vorhaben:
http://www.python-forum.de/topic-16220.html

Momentan lese ich experimentell aus einer Textdatei, erzeuge HTML mit pyTextile und baue das mit Genshi in ein template.html ein.

Markup ist zwar gut, aber das meiste brauche ich davon gar nicht, dafür anderes. Ich möchte z.B. dass URLs automatisch zu Links werden.
Anderes lässt sich mit Textile gar nicht machen, da muss dann HTML von Hand rein.
Ein code-feature wie hier im Forum wär auch praktisch. Deswegen wär's cool wenn der Parser leicht zu erweitern wäre. Dazu habe ich ja auch schon einen heißen Tipp bekommen.

Eigentlich brauche ich die Genshi-Features auch gar nicht, es würde reichen die $xxxxx aus template.html zu ersetzen.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Auto-Links gibt es in Markdown: `<http://www.example.com/>` und in reST etwas ähnliches. Komplett automatische Link-Hervorhebung nicht (die auch nicht immer unproblematisch ist), doch zumindest in Markdown wüsste ich, dass sich das recht leicht einbauen lässt. Nur wenn du (so nehme ich an) die Quellen selbst schreibst, kannst du da auch eben die paar Zeichen mehr rantippseln.

Für Code-Highlighting empfehle ich Pygments, das sich sowohl über Markdown (Pygments enthält dazu glaube ich noch ein Snippet von mir) als auch docutils/reST (Code auf der Pygments-Seite) einbinden lässt.

reST und Pygments benutze ich mittlerweile zufrieden auf einer Website für News mit Code darin.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

ja, pygments habe ich auch schon ausprobiert, aber eben noch nicht eingebunden. Bei reST schreckt mich ein bisschen die Titel-Auszeichnung mit == ab, vielleicht gibt es da ja auch eine Alternative.

rest2web parst ebenfalls eine textdatei namens http://www.voidspace.org.uk/python/rest ... index.html

Mhh. Die Qual der Wahl.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

So was Doofes, HTML lässt sich auch nicht wirklich einbauen, denn spätestens bei etwas wie

Code: Alles auswählen

<span class="classname">
ist schluss!

Vielleicht sollte ich getrennte Dateien verwenden, aber das wollte ich eigentlich vermeiden. Oder die Datei erst an einem Kennzeichen zweiteilen, und nur den ersten Teil in key/value zerlegen. Mhh.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Wie wichtig ist es dir denn das du den HTML-Content innerhalb der XML-Datei im Klartext lesen kannst?
Weil wenn dich das nicht interessiert, würde ich den Vorschlag machen
den gesamtenen HTML-Stream mit Base46 zu kodieren und dann in deiner XML-Struktur abzuspeichern.

Wenn du den HTML-Content dann wiederhaben möchtest musst du ihn einfach nur wieder decodieren.

Eigentlich ganz easy und imho sichere Vorgehensweise:

Code: Alles auswählen

In [36]: html = u"""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
   ....: <html>
   ....: <head>
   ....: <meta http-equiv="content-type" content="text/html; charset=UTF-8">
   ....: <title>Bla</title>
   ....: </head>
   ....: <body>
   ....: <h1>Hello Wörld</h1>
   ....: </body>
   ....: </html>"""

In [37]: from xml.etree import ElementTree as ET

In [38]: import base64

In [39]: node = ET.Element("HTML")

In [41]: node.set("html", base64.encodestring(html.encode("utf-8")))

In [43]: xml = ET.tostring(node)

In [44]: root = ET.XML(xml)

In [45]: print unicode(base64.decodestring(root.get("html")), "utf-8")
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Bla</title>
</head>
<body>
<h1>Hello Wörld</h1>
</body>
</html>
Edit: Man kann zum Speicher sparen natrülich auch noch zlib extra dazu nehmen... ;)
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Danke für den Vorschlag! Ich möchte ich den Inhalt (Markup/HTML) allerdings von Hand schreiben, das Codieren ist da etwas unpraktisch. :-)
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

arghargh hat geschrieben:Nachdem ich gemerkt habe, dass es ungünstig ist, Markup/HTML in XML zu speichern [...]
Darf ich da nochmal nachhaken: Wie kommst du zu dieser Annahme? Wenn du XHTML meinst, kannst du es wunderbar innerhalb von XML unterbringen. Für die Eingabe von Hand dürfte es einfacher sein, dem XML-Gerüst um deinen User-Markup einen explizit vorangestellen Namespace zu geben und XHTML als Default zu verwenden.

Bestehende XML-Parser musst du nicht neu erfinden, über die Baumstruktur und z. B. XPath lässt sich ordentlich navigieren und Pygments kannst du immer noch nachträglich über CDATA-Blöcke jagen.
arghargh
User
Beiträge: 81
Registriert: Donnerstag 4. September 2008, 22:26

Das war nur eine Annahme, ich habe keine Ahnung von XML. Ich bin nur über XHTML Tags im XML gestolpert. Aber dass es möglich sein müsste, XHTML in XML einzubauen leuchtet ein. Vielleicht versuche ich das später nochmal.
Antworten