Moin Moin,
wie man sieht bin ich neu hier. Ich habe schon verschiedene Themen mir angeguckt aber noch nicht die Lösung für mein Problem gefunden.
Worum es geht:
Ich habe hier eine .stl Datei und muß ein paar Einträge darin ändern/neu schreiben. Ich habe vor die Einträge per Schleife zu suchen und dann zu ändern. Diese Änderung kann mit dem Rest gerne in einer neuen .stl Datei gespeichert werden. Folgendes Thema hab ich gefunden aber bin nicht weiter gekommen.
http://www.python-forum.de/viewtopic.php?f=1&t=22272
Bei mir geht es um Einträge die so aussehen:
solid |name0
Ich möchte diese Einträge ändern in:
solid name
Also nur diesen Strich| und die 0 wegmachen damit ich weitere Manipulationen an der stl vornehmen kann.
Danke im Vorraus
Manipulation von Daten und schreiben einer neuen Datei
@SeSch83: Eingabedatei öffnen, Ausgabedatei öffnen, und dann Zeilenweise lesen, re.sub() anwenden, und wegschreiben.
Edit: Es sei denn '|name0' ist wörtlich gemeint — dann reicht natürlich `replace()` auf Zeichenketten statt `re`.
Edit: Es sei denn '|name0' ist wörtlich gemeint — dann reicht natürlich `replace()` auf Zeichenketten statt `re`.
Hier mal der Anfang der Datei:
solid |bug0
facet normal -0.113002625886 -0.989459080664 -0.0905601139273
outer loop
vertex 213.040836451 3.06566667369 6.57061722615
vertex 213.470171332 3.01640499742 6.57311770944
vertex 213.039058445 3.05705648997 6.66691065449
endloop
endfacet
facet normal -0.115561392718 -0.987948110136 -0.102976192357
outer loop
vertex 213.039058445 3.05705648997 6.66691065449
vertex 213.470171332 3.01640499742 6.57311770944
Und erstmal noch Danke für die Schnelle Antwort. Ich möchte wirklich nur aus der ersten Zeile dies machen, solid bug.
Diese Schreibweise taucht noch mehrfach mit anderen Namen in der Datei auf nur solid, der Strich und die 0 sind konstant.
Habe bis jetzt mit dem Code von CM aus dem Thema rumprobiert und wäre für eine nähere Erläuterung der von Dir genannten Funktionen dankbar.
Sonnige Grüße von der Ostsee
solid |bug0
facet normal -0.113002625886 -0.989459080664 -0.0905601139273
outer loop
vertex 213.040836451 3.06566667369 6.57061722615
vertex 213.470171332 3.01640499742 6.57311770944
vertex 213.039058445 3.05705648997 6.66691065449
endloop
endfacet
facet normal -0.115561392718 -0.987948110136 -0.102976192357
outer loop
vertex 213.039058445 3.05705648997 6.66691065449
vertex 213.470171332 3.01640499742 6.57311770944
Und erstmal noch Danke für die Schnelle Antwort. Ich möchte wirklich nur aus der ersten Zeile dies machen, solid bug.
Diese Schreibweise taucht noch mehrfach mit anderen Namen in der Datei auf nur solid, der Strich und die 0 sind konstant.
Habe bis jetzt mit dem Code von CM aus dem Thema rumprobiert und wäre für eine nähere Erläuterung der von Dir genannten Funktionen dankbar.
Sonnige Grüße von der Ostsee
@SeSch83: Für die ``with``-Anweisung, `open()`, Zeichenketten, ``for``-Schleifen, und das `re`-Modul gibt es eigentlich Dokumentation. Und ein Tutorial in der Dokumentation, dass man IMHO mal durchgearbeitet haben sollte. Für Programmieranfänger wird oft Learn Python The Hard Way empfohlen. Nicht vom Namen verwirren lassen. Für reguläre Ausdrücke gibt es bei der Python-Dokumentation zusätzlich noch ein Howto. Und auch jede Menge Informationen jenseits von Python, weil reguläre Ausdrücke ja kein spezielles Python-Thema sind.
Keine Sorge ich wollte nicht den perfekten Code von Euch verlangen nur eine Idee wie es mit welchen Mitteln zu lösen wäre. Dafür Danke!
Ich bin auch ein Freund von "Selber machen" und reinfinden in die Problematik und deren Lösung.
Ich melde mich wenn alles klappt oder wenn nicht
Sebastian
Ich bin auch ein Freund von "Selber machen" und reinfinden in die Problematik und deren Lösung.
Ich melde mich wenn alles klappt oder wenn nicht
Sebastian
So hab eine "Lösung" gefunden. Bitte nicht böse sein, diese Lösung wird Euch Veteranen die Tränen in die Augen treiben.
Geht bestimmt kürzer und eleganter. Ich möchte aber die Quelldatei behalten und die Zwischenschrittdatei kann ja per
Systembefehl gelöscht werden im weiteren Skript.
"Lösung":
Danke nochmals für den Tipp mit der replace()-Funktion.
Geht bestimmt kürzer und eleganter. Ich möchte aber die Quelldatei behalten und die Zwischenschrittdatei kann ja per
Systembefehl gelöscht werden im weiteren Skript.
"Lösung":
Code: Alles auswählen
fname = "KCS_einteil_fein.stl"
infile = open(fname)
outfile = open(fname[:-4] + "_halbfertig.stl", 'w')
for line in infile:
if 'solid |' in line:
outfile.write(line.replace("|", ""))
else:
outfile.write(line)
infile.close()
outfile.close()
fname = "KCS_einteil_fein_halbfertig.stl"
infile = open(fname)
outfile = open(fname[:-15] + "_fertig.stl", 'w')
for line in infile:
if 'solid ' in line:
outfile.write(line.replace("0", ""))
else:
outfile.write(line)
infile.close()
outfile.close()
Zuletzt geändert von Hyperion am Mittwoch 10. Juli 2013, 18:35, insgesamt 1-mal geändert.
Grund: Code in Python-Code-Blöcke gesetzt
Grund: Code in Python-Code-Blöcke gesetzt
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Dateien solltest Du - wie BlackJack es schon geschrieben hat - mittels ``with`` öffnen:
Damit ist sichergestellt, dass die Datei auf jeden Fall geschlossen wird - es ist kein expliziter Aufruf von ``fileobject.close`` notwendig.
Wie kbr schon sagte, solltest Du die Datei nur *einmal* einlesen und alle Ersetzungen erledigen. Das Lesen und Schreiben von Dateien (letztlich *alle* IO-Operationen) sind ziemlich teuer und sollten daher nur dann erfolgen, wenn es unbedingt notwendig ist.
Für das Zusammenbauen (und aufteilen) von Dateinamen gibt es Funktionen, z. B. ``os.path.join``.
``fname`` ist nicht so doll als Name - wieso nicht ``filename``? Das vermittelt viel klarer, was sich hinter dem Namen verbirgt. Klar kann man bei dem kleinen Script und dem schnell zu erfassenden Kontext darauf kommen, dass das ``f`` für ``file`` steht - aber wieso diese drei Buchstaben sparen, wenn der längere Name das Verständnis erhöht?
Code: Alles auswählen
with open(...) as fileobject:
# do something with fileobject
Wie kbr schon sagte, solltest Du die Datei nur *einmal* einlesen und alle Ersetzungen erledigen. Das Lesen und Schreiben von Dateien (letztlich *alle* IO-Operationen) sind ziemlich teuer und sollten daher nur dann erfolgen, wenn es unbedingt notwendig ist.
Für das Zusammenbauen (und aufteilen) von Dateinamen gibt es Funktionen, z. B. ``os.path.join``.
``fname`` ist nicht so doll als Name - wieso nicht ``filename``? Das vermittelt viel klarer, was sich hinter dem Namen verbirgt. Klar kann man bei dem kleinen Script und dem schnell zu erfassenden Kontext darauf kommen, dass das ``f`` für ``file`` steht - aber wieso diese drei Buchstaben sparen, wenn der längere Name das Verständnis erhöht?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert