Manipulation von Daten und schreiben einer neuen Datei

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
SeSch83
User
Beiträge: 4
Registriert: Mittwoch 10. Juli 2013, 12:07

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
BlackJack

@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`.
SeSch83
User
Beiträge: 4
Registriert: Mittwoch 10. Juli 2013, 12:07

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
BlackJack

@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.
SeSch83
User
Beiträge: 4
Registriert: Mittwoch 10. Juli 2013, 12:07

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
SeSch83
User
Beiträge: 4
Registriert: Mittwoch 10. Juli 2013, 12:07

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":

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()
Danke nochmals für den Tipp mit der replace()-Funktion.
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
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

SeSch83 hat geschrieben:Danke nochmals für den Tipp mit der replace()-Funktion.
Die lässt sich auch mehrmals hintereinander anwenden.
Benutzeravatar
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:

Code: Alles auswählen

with open(...) as fileobject:
    # do something with fileobject
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?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten