Seite 1 von 1

Verfasst: Sonntag 10. Februar 2008, 15:44
von Cassiopeia
Grüße,

das Thema ist zwar schon etwas älter, aber wie es ausschaut wurde hier nich wirklich zu ende geredet.

Ich möchte ein Programm schreiben das mir eine Datei umwandelt. Ich habe mir den Code der Quell und der Zieldatei gut angeschaut und herausgefunden das nur die struktur etwas anders ist.

Ich hab noch nicht mit wirklich mit Python gearbeitet, habe nur ein Tutorial durchgearbeitet von dieser page: http://www.freenetpages.co.uk/hp/alan.g ... /index.htm

Mein Ziel ist es, dass das Programm folgenden Text in den darauf folgenden umwandelt.

QuellCode:

Code: Alles auswählen

solid
	{
		"id" "2"
		side
		{
			"id" "1"
			"plane" "(-1792 -640 160) (-1792 -640 128) (-1792 -128 128)"
			"material" "WALL/STONEWALL02C"
			"uaxis" "[0 1 0 0] 0.25"
			"vaxis" "[0 0 -1 128] 0.25"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
		side
		{
			"id" "2"
			"plane" "(-1776 -128 160) (-1776 -128 128) (-1776 -640 128)"
			"material" "WALL/STONEWALL02C"
			"uaxis" "[0 1 0 0] 0.25"
			"vaxis" "[0 0 -1 128] 0.25"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
		side
		{
			"id" "3"
			"plane" "(-1776 -640 160) (-1776 -640 128) (-1792 -640 128)"
			"material" "WALL/STONEWALL02C"
			"uaxis" "[-1 0 0 0] 0.25"
			"vaxis" "[0 0 -1 128] 0.25"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
		side
		{
			"id" "4"
			"plane" "(-1792 -128 160) (-1792 -128 128) (-1776 -128 128)"
			"material" "WALL/STONEWALL02C"
			"uaxis" "[-1 0 0 -448] 0.25"
			"vaxis" "[0 0 -1 128] 0.25"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
		side
		{
			"id" "5"
			"plane" "(-1792 -128 128) (-1792 -640 128) (-1776 -640 128)"
			"material" "TOOLS/TOOLSNODRAW"
			"uaxis" "[1 0 0 0] 0.5"
			"vaxis" "[0 -1 0 0] 0.5"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
		side
		{
			"id" "6"
			"plane" "(-1792 -640 160) (-1792 -128 160) (-1776 -128 160)"
			"material" "WALL/SITEBWALL05"
			"uaxis" "[1 0 0 -305] 0.25"
			"vaxis" "[0 -1 0 -128] 0.25"
			"rotation" "0"
			"lightmapscale" "16"
			"smoothing_groups" "0"
		}
	}
ZielCode:

Code: Alles auswählen

// brush 2
{
 ( -1792 -640 160 ) ( -1792 -640 128 ) ( -1792 -128 128 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
 ( -1776 -128 160 ) ( -1776 -128 128 ) ( -1776 -640 128 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
 ( -1776 -640 160 ) ( -1776 -640 128 ) ( -1792 -640 128 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
 ( -1792 -128 160 ) ( -1792 -128 128 ) ( -1776 -128 128 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
 ( -1792 -128 128 ) ( -1792 -640 128 ) ( -1776 -640 128 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
 ( -1792 -640 160 ) ( -1792 -128 160 ) ( -1776 -128 160 ) caulk 64 64 0 0 0 0 lightmap_gray 16384 16384 0 0 0 0
}
Wie man sehn kann braucht der ZielCode aus jeder "side" vom Quellqode nur die "plane" Koordinaten. Den Rest könnte das Programm selber einfügen. Am ende Soll er das ganze in einer neuen Datei abspeichern.

Frage ist wie schreib ich mein Programm so das es das tut? schreibt mir bitte nicht nur modul-namen rein, ich kenn mich damit noch net so ganz aus. Es sind noch mehr sachen drinn die ersetzt werden müssen aber wenn mir hierzu jemand helfen kann, werd ich vllt auch mit dem andern kram klarkommen, ansonsten müsst ich halt nochmal fragen. ^^

Danke im Voraus
Gruß Cassiopeia

Verfasst: Sonntag 10. Februar 2008, 16:24
von Hyperion
Ich denke das geht relativ einfach per regexp! Das sollte Dir helfen:
http://www.amk.ca/python/howto/regex/
Außerdem empfehle ich dazu kodos:
http://kodos.sourceforge.net/

Damit solltest Du das relativ einfach hinbekommen können!

Ciao,
Hyperion

Verfasst: Sonntag 10. Februar 2008, 16:56
von EyDu
Nah das sieht doch ganz nach dem map-Format aus :-) Wenn ich mich richtig erinnere, konnten dort beliebig tiefe Verschachtelungen innerhalb der Objekte erstellt werden, da reichen einfache Reguläre Ausdrücke nicht mehr aus.

Entweder würde ich gleich den Inhalt vernünftig parsen oder, du baseltst dir einen kleinen Pseudo-Parser für dieses Format. Dazu sollte es genügen, wenn du dich an den öffnenden und schliessenden geschwungenen Klammern orientierst (rekursiv durch die Ebenen). Die letzte Ebene, mit dem eigentlichen Inhalt, kannst du dann schnell mit Regulären Ausdrücken abarbeiten:

Code: Alles auswählen

solid
|-id (hier mit REs arbeiten)
|-side
| |-Hier mit REs arbeiten
|-side
| |-Hier auch mir REs arbeiten
Um die Eizelnen Ebenen zu modellieren sollte ein einfaches Dictionary genügen. Eigene Klassen wären natürlich etwas komfortabler.

Für das Format sollte es in jedem Fall genügen.

what he saaays??

Verfasst: Sonntag 10. Februar 2008, 20:20
von Cassiopeia
gibts da auch deutsche Seiten die das erklärn @Hyperion? ich tu mich immer echt schwer bei englischen Seiten "code" von "geschwafel" zu unterscheiden.


ps.: Ja es ist ein .map-file :D

Verfasst: Sonntag 10. Februar 2008, 21:16
von Hyperion
Also da mußt Du schon mal selber googlen ;) Oder such mal hier im Forum! Ich bin sicher das wird nicht so schwer sein, sich in die Basics davon einzuarbeiten. Und ohne Verschachtelungen ist es auch sehr sehr simpel ...

Verfasst: Montag 11. Februar 2008, 17:00
von numerix
"Einfach mit RE" ist es natürlich nur, wenn man sich mit RE auskennt oder den Aufwand nicht scheut, sich damit gründlich zu beschäftigen.

Vielleicht habe ich ja etwas falsch verstanden, aber ich würde es ohne RE und irgendwelche rekursiven Geschichten so machen:

Originaldatei zeilenweise einlesen, jeweils prüfen, ob das Schlüsselwort "plane" vorkommt, anhand der ersten sich öffnenden und der letzten sich schließenden Klammer mittels der String-Methoden .index() bzw. .rindex() den benötigten Bereich mit den Zahlentripeln ermitteln, mittels Slicing den benötigten Teil kopieren und in die Zieldatei schreiben.

Oder übersehe ich da irgendetwas?

Verfasst: Montag 11. Februar 2008, 18:07
von Cassiopeia
Hört sich so garnich schlecht an. Leider versteh ich soziemlich null davon, und bräuchte eigentlich sowas wie n codeschnippsel um was damit anfangen zu können.

Ich bin imo schon wie wild am googln um mal irgendwie n codeschnippsel oder n beispiel zu bekommen, allerdings scheint das net wirklich viel zu bringen.

Verfasst: Montag 11. Februar 2008, 18:33
von BlackJack
Python-Tutorial aus der Doku durcharbeiten. Doku zu Dateiobjekten und Zeichenketten nach nützlichem absuchen. Und ein wenig interaktiv ausprobieren.

Code: Alles auswählen

In [478]: cat test.txt
a truediv 1000
b mul 153

In [479]: f = open('test.txt')

In [480]: for line in f:
   .....:     print line,
   .....:
a truediv 1000
b mul 153

In [481]: line = '      a(1 2 3)     \n'

In [482]: line.strip()
Out[482]: 'a(1 2 3)'

In [483]: line = line.strip()

In [484]: line.startswith('a(')
Out[484]: True

In [485]: line.index('(')
Out[485]: 1

In [486]: line.rindex(')')
Out[486]: 7

In [487]: line[2:7]
Out[487]: '1 2 3'

Verfasst: Montag 11. Februar 2008, 18:40
von Cassiopeia
wasn für ne doku, häää??? :shock:

aus dem code werd ich net schlau.

Verfasst: Montag 11. Februar 2008, 18:48
von BlackJack
Die offizielle Python-Doku und da das Tutorial.

Verfasst: Montag 11. Februar 2008, 19:06
von Cassiopeia
oh nee, net scho wieder englisch :cry:

Ich werd jahre brauchen bis ich da durchsteige, ich glaub ich sollts wohl besser lassen.

Verfasst: Montag 11. Februar 2008, 19:21
von numerix
Mach doch einfach das, was BlackJack vorgeschlagen (und auch gleich demonstriert) hat: Interaktiv experimentieren! Das ist doch (auch) das Tolle an Python!

Und, mal ehrlich: Wenn du die Lektüre englischsprachiger Doku etc. scheust, dann wirst du es mit dem Programmieren vermutlich immer schwer haben.

Auch wenn man im Englischen nicht so fit ist: DAS Original Python-Tutorial liest sich bestimmt einfacher als ein englischer Zeitungsartikel, weil sich manche Fachbegriffe gar nicht so sehr vom Deutschen bzw. den auch im Deutschen üblichen Fachbegriffen für diese Dinge unterscheiden.

Es gibt natürlich auch dt. Tutorials im Netz, aber so wie ich das sehe kranken die so ziemlich alle daran, dass sie vom aktuellen Stand mehr oder weniger weit entfernt sind; meistens eher "mehr". (Natürlich lasse ich mich gerne vom Gegenteil überzeugen).

Sicher wäre es kein Problem, dass irgendjemand den von dir gewünschten "Codeschnipsel" (am besten gleich das ganze Skript ...) hier postet, aber etwas mehr eigene Anstrengung wird schon erforderlich sein, wenn du Python wirklich verstehen willst. In diesem Sinne: Nicht aufgeben, sondern lesen, experimentieren und schlauer werden ...

Verfasst: Montag 11. Februar 2008, 20:24
von Leonidas
pütone hat geschrieben:Es gibt natürlich auch dt. Tutorials im Netz, aber so wie ich das sehe kranken die so ziemlich alle daran, dass sie vom aktuellen Stand mehr oder weniger weit entfernt sind; meistens eher "mehr". (Natürlich lasse ich mich gerne vom Gegenteil überzeugen).
Für das was Anfänger brauchen reichen auch ältere Tutorials (hauptsache sie sind brauchbar und nicht Schrott). Man muss nicht am zweiten Tag schon das ``with``-Statement verstehen und die Contextlib verwenden.

Verfasst: Dienstag 12. Februar 2008, 10:42
von Mad-Marty
kleiner tip wie man das auf einfachstem wege erreichen könnte ...
befasse dich mit string methoden.

Code: Alles auswählen

text = '        {\n            "id" "6"\n            "plane" "(-1792 -640 160) (-1792 -128 160) (-1776 -128 160)"\n            "material" "WALL/SITEBWALL05"\n            "uaxis" "[1 0 0 -305] 0.25"\n            "vaxis" "[0 -1 0 -128] 0.25"\n            "rotation" "0"\n            "lightmapscale" "16"\n            "smoothing_groups" "0"\n        }'

for line in text.splitlines():
 	if line.strip().startswith('"plane"'):
 		line = line.strip().split(" ", 1)[1].replace('"', '')
 		print line + ".... X Y Z Blah"
 		
(-1792 -640 160) (-1792 -128 160) (-1776 -128 160).... X Y Z Blah