Textdatei einlesen, auswerten und als tuple/dict abspeichern

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
calo
User
Beiträge: 41
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Mittwoch 9. Januar 2008, 22:02

Hallo,

Ich stehe wieder mal auf dem Schlauch und komme deshalb nicht weiter. Ich möchte eine Textdatei einlesen und darin die ganzen Elemente scannen und als als eine Kombination von tuple/dict wieder abspeichern.

Die Datei könnte dabei folgendermaßen aussehen:
**
** elements.inp
**
*Element, elset=set1, Type=CPS3
1, 214, 104, 213
2, 126, 125, 19
3, 203, 127, 128
4, 128, 127, 31
5, 233, 200, 199
*Element, elset=set2, type=CPS4
6, 234, 86, 85, 23
7, 233, 156, 129, 85
8, 191, 78, 77, 34
9, 131, 130, 41, 3
10, 164, 163, 46, 923
**
Das Ergebnis sollte dann so aussehen:

Code: Alles auswählen

#
# meshfile.py
#
elements = ((CPS3, 
{ 1: (214, 104, 213),
2: (126, 125, 19),
3: (203, 127, 128),
4: (128, 127, 31),
5: (233, 200, 199)}),
(CPS4, {6: (234, 86, 85, 23),
7: (233, 156, 129, 85),
8: (191, 78, 77, 34),
9: (131, 130, 41, 3),
10: (164, 163, 46, 923)}), )
Für einen einzelnen Elementblock funktioniert mein Skript soweit. Aber wenn es mehrere sind stimmt das Ergebnis nicht mehr.

Code: Alles auswählen

deck_file = file("elements.inp", "r")
deck_lines = deck_file.readlines()
deck_file.close()
output_file = file("meshfile.py", "w")

output_file.write("}\n\nelements = (")
inline = False
elementlines = []
for line in deck_lines:
	if '*element,' in line.lower():
		element_type_ = line.strip().split(",")
		for t in element_type_:
			if "type" in t.lower():
				element_type = t.split("=")[-1]
		inline = True
	elif inline == True and '*' not in line:
		elementlines.append(line.strip())
	elif inline == True and '*' in line:
		inline = False
		label_list = []
		node_list = []
		for line in elementlines:
			tokens = line.strip().split(",")
			line_values = tuple(map(int, tokens))
			label_list.append(line_values[0])
			node_list.append( line_values[1:] )

		elements = dict(zip(label_list, node_list))
		output_file.write("(%s, { " % element_type)
		for line in elements.keys():
			output_file.write(str(line)+": "+str(elements[line])+",\n\t\t")
		output_file.write("}), ")

output_file.write(")")
output_file.close()
Vieleicht seht ihr mein Fehler.

Vielen Dank, Calo
calo
User
Beiträge: 41
Registriert: Freitag 8. Dezember 2006, 21:35
Wohnort: Stuttgart

Samstag 12. Januar 2008, 13:42

Hallo,

hartes stück arbeit. Aber ich habe es doch noch selber geschafft. Ich werde aber den Eindruck nicht los, dass ich viel zu kompliziert gedacht habe. Hier meine Lösung: http://paste.pocoo.org/show/20853/

Weiterhin ein etwas größeres Inputdeck (ABAQUS FEM-Quellcode, http://de.wikipedia.org/wiki/Finite-Elemente-Methode), an das man mein Skript testen kann: http://paste.pocoo.org/show/20854/

Gibt es da einfachere Methoden Text-Dateien in spezielen Formaten, insbesondere FEM-Quellcodes (diese sind in der Regel ASCII-Dateien) zu analysieren und in einem selbstgestricken Python-Objekt abzulegen um es zu einem späteren Zeitpunkt weiter zu verarbeiten?

Grüße, Calo
BlackJack

Samstag 12. Januar 2008, 15:53

So schlecht sieht's doch gar nicht aus wenn man mal davon absieht, das mit globalen Listen gearbeitet wird.
Antworten