Wort aus der Zeile einer .inp-Datei löschen

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
maxwer
User
Beiträge: 16
Registriert: Mittwoch 20. Januar 2021, 11:46

Guten Tag,

ich arbeite an einem Programm welches Informationen aus einer .inp-Datei ausliest und kopiert. Das Prinzip zum Einlesen und Kopieren von Inhalten ist mir vertraut.

Jedoch lassen sich nicht alle Inhalte einfach 1zu1 übertragen. Manche zu ändernde Zeilen habe ich mit dem beigefügtem Code bearbeitet.

Code: Alles auswählen

import os 

def main():
    with open('WPS_Elek_Elemente_oE.txt') as lines, open('WPS_Elek_Elemente.txt', 'w') as output:
        for line in lines:
            if line == '*Element, type=CAX4\n':
                line = '*Element, type=DCAX4E\n'
            if line == '*Element, type=CAX3\n':
                line = '*Element, type=DCAX3E\n'
            output.write(line)
    datei= 'WPS_Elek_Elemente_oE.txt'
    if os.path.isfile(datei):    # falls Dabei existiert 
        os.remove(datei)
if __name__ == "__main__":
    main()
Für die letzte Stufe in der Programmerstellung möchte ich einzelne Worte aus Zeilen löschen. Die Zeilen unterscheiden sich dabei von einander, sodass der hier angezeigte Code nicht sinnvoll verwendet werden kann.
Anbei ein Ausschnitt der Zeilen aus meiner inp.-Datei:

*Elset, elset=NALL, instance=Elektrode_oben, generate
1, 14575, 1
*Elset, elset=NALL, instance=Blech-1, generate
1, 5456, 1
*Elset, elset=NALL, instance=Elektrode_unten, generate
1, 14575, 1
*Elset, elset=NALL, instance=Blech-2, generate
1, 5412, 1

Das Ziel soll es sein den Begriff "instance=*Teilename*," zu löschen sodass sich folgender bereinigter Inhalt ergibt:

*Elset, elset=NALL, generate
1, 14575, 1
*Elset, elset=NALL, generate
1, 5456, 1
*Elset, elset=NALL, generate
1, 14575, 1
*Elset, elset=NALL, generate
1, 5412, 1

Meine Frage(n):
Wie kann ich ein Dokument nicht nur in seine Zeilen unterteilen sondern auch in die Wörter der Zeile?
Welchen Befehl zum entfernen des besagten Inhaltes sollte ich verwenden?
Wie kann ich "instance=..." löschen obwohl die Teilenamen nach dem Ist-Gleich-Zeichen variieren?
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Das kannst Du entweder per Regulärem Ausdruck machen oder Du teilst eine Zeile am , auf, (str.split) erzeugst daraus eine neue Liste, die Strings, die mit instance= anfangen, nicht mehr enthält, und packst sie mit join wieder zu einem String zusammen.
split und join sollten in jedem Anfängertutorial bei den Stringfunktionen erklärt werden.
maxwer
User
Beiträge: 16
Registriert: Mittwoch 20. Januar 2021, 11:46

Was wäre der reguläre Ausdruck?
Das Problem mit dem teilen der Zeilen ist, dass die ich weitere Zeilen habe in denen der gesuchte Ausdruck vorkommt, diese jedoch unterschiedlich anfangen.
Hier ein weiterer Auszug aus meiner .inp-Datei

*Nset, nset=SET-1, instance=Elektrode_oben, generate
1, 16704, 1
*Nset, nset=SET-1, instance=Elektrode_unten, generate
1, 16704, 1
*Elset, elset=SET-1, instance=Elektrode_oben, generate
1, 14575, 1
*Elset, elset=SET-1, instance=Elektrode_unten, generate
1, 14575, 1
*Nset, nset=SET-2, instance=Blech-1, generate
1, 8400, 1
*Elset, elset=SET-2, instance=Blech-1, generate
1, 5456, 1
*Nset, nset=SET-3, instance=Blech-2, generate
1, 8334, 1
*Elset, elset=SET-3, instance=Blech-2, generate
1, 5412, 1
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Das macht für das Teilen keinen Unterschied

Code: Alles auswählen

input_text= """*Nset, nset=SET-1, instance=Elektrode_oben, generate
1, 16704, 1
*Nset, nset=SET-1, instance=Elektrode_unten, generate
1, 16704, 1
*Elset, elset=SET-1, instance=Elektrode_oben, generate
1, 14575, 1
*Elset, elset=SET-1, instance=Elektrode_unten, generate
1, 14575, 1
*Nset, nset=SET-2, instance=Blech-1, generate
1, 8400, 1
*Elset, elset=SET-2, instance=Blech-1, generate
1, 5456, 1
*Nset, nset=SET-3, instance=Blech-2, generate
1, 8334, 1
*Elset, elset=SET-3, instance=Blech-2, generate
1, 5412, 1"""

for word in input_text.split(", "):
    if not word.startswith("instance"):
        print(word)

# bzw.

words = [word for word in input_text.split(", ") if not word.startswith("instance=")]
output = ", ".join(words)
Das musst du nur entsprechend anpassen, da du die Daten ja schon zeilenweise vorliegen hast. Aber das Prinzip sollte mit dem Beispiel klar werden.
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

Mit einem regulären Ausdruck:

Code: Alles auswählen

>>> instance_re = re.compile(", instance=[^,]+")
>>> instance_re.sub("", "*Nset, nset=SET-2, instance=Blech-1, generate")
'*Nset, nset=SET-2, generate'
Antworten