Zeilen anhängen bis Ende gefunden wird

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.
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

Sorry es sind ein paar Fehler drin

Ich hab einen Text in dem steht z.b.
Das ist der Anfang mit mit dem Zusatz \n
doch es ist noch nicht Schluss sondern \n
erst hier ist Ende

die"\n" sind nur zur verdeutlichung das dort ein Zeilenumbruch ist

Jetzt will ich die Zeile so formatieren das sie so aussieht:

Das ist der Anfang mit mit dem Zusatz doch es ist noch nicht Schluss sondern erst hier ist Ende

Code: Alles auswählen

def main():
    in_file = open('Datei', 'r')
    out_file = open('Geänderte Datei', 'w')
   
    for line in in_file:
        if 'Anfang' in line and 'Zusatz' in line and not 'Ende' in line:
            line = line.strip()
            while not ');' in line:
                  line = line.strip()
                   
        out_file.write(line)
 
    in_file.close()
    out_file.close()
BlackJack

DatenMetzgerX hat geschrieben:
BlackJack hat geschrieben:@madthomas: Was heisst IDLE stürzt ab? Wie äussert sich das?

Wenn ich mal raten müsste suchst Du so etwas:

Code: Alles auswählen

def main():
    in_file = open('Datei', 'r')
    out_file = open('Geänderte Datei', 'w')
   
    in_block = False
    for line in in_file:
        if 'Anfang' in line and 'Zusatz für Anfang' in line:
            in_block = True
        if 'Ende' in line:
            in_block = False
        if in_block:
            line = line.strip()
        out_file.write(line)
   
    in_file.close()
    out_file.close()

Je nachdem welche Zeilen "ge-stripped" werden sollen, muss man den Code in der Schleife eventuell noch ein wenig umordnen.
Birgt einige gefahren, dadurch das in_block nicht überschrieben werden muss, kann die Variable noch den wert des letzen durchganges beinhaltetn.
Das ist keine Gefahr das soll und muss so sein. Es soll nicht jede Zeile einzeln betrachtet werden, sondern alle Zeilen zwischen "Anfang" und "Ende" verarbeitet werden, da muss man sich also merken ob man sich gerade in einem Block, zwischen Anfang und Ende, befindet oder nicht.

@maddthomas: Na dann funktioniert mein Beispiel doch fast. Man muss nur nach dem `strip()`en noch ein Leerzeichen anhängen sonst kleben die Worte an den ehemaligen Zeilenübergängen aneinander.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

DatenMetzgerX hat geschrieben: Birgt einige gefahren, dadurch das in_block nicht überschrieben werden muss, kann die Variable noch den wert des letzen durchganges beinhaltetn.
Ich glaube, das ist hier das erwünschte Verhalten.
Ansonsten wäre es hilfreich, wenn uns madthomas mal ein Beispiel
seiner Daten postet.
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

so hab jetzt die Version von BlackJack genommen und sie funktioniert.
brauchte kein Leerzeichen einzufügen sie nächsten Zeilen mit Leerzeichen beginnen und der löscht alle bis auf 1.

@mkallas reicht dir das bsp. oben nicht

Code: Alles auswählen

class Zeile:

  def zuAendern(self, line, in_block):
    if 'Anfang' in line and 'Zusatz' in line:
        in_block = True
    if 'Ende' in line:
        in_block = False
    if in_block:
        line=line.strip()
    return(line)

in_file = open("Datei", "r")
out_file = open("GeänderteDatei", "w")
Z = Zeile()
   
in_block = False
for line in in_file:
    line = Z.zuAendern(line, in_block)
    out_file.write(line)
   
in_file.close()
out_file.close()
Hab noch so meine Probleme mit den Klassen kann mir einer sagen was da falsch ist
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

madthomas hat geschrieben:@mkallas reicht dir das bsp. oben nicht
Doch, leider haben sich unsere beiden Einträge ins Forum zeitlich überschnitten.
Hättest du das Beispiel direkt gebracht, hätte sich keiner den Kopf darüber zerbrechen müssen. :)
BlackJack

@madthomas: An der Klasse ist "falsch", dass mir nicht so ganz klar ist warum Du eine Klasse brauchst!?

Und funktionieren tut das ganze nicht, weil `in_block` in der Methode lokal ist und nach Abarbeitung der Methode verschwindet. Das ganze an dieser Stelle in auseinander zu nehmen und einen Teil in eine Funktion zu stecken ist etwas ungünstig. Wenn Du die Funktion mit den Zeilen von den Dateien entkoppeln willst, würde ich eine Generatorfunktion vorschlagen.

Code: Alles auswählen

def process_lines(lines):
    in_block = False
    for line in lines:
        if 'Anfang' in line and 'Zusatz' in line:
            in_block = True
        if 'Ende' in line:
            in_block = False
        if in_block:
            line = line.strip() + ' '
        yield line


def main():
    in_file = open('test.txt', 'r')
    out_file = open('test2.txt', 'w')
    
    out_file.writelines(process_lines(in_file))
    
    in_file.close()
    out_file.close()
``return`` ist übrigens keine Funktion, die Klammern sind etwas verwirrend.
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

wollte halt wissen ob das mit der Klasse klappt aber ist nicht so wichtig.
Danke für eure Hilfe
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

Leider hab ich jetzt noch ein weiteres Problem, die Zeilen stehen jetzt in einem String drin und jetzt will ich sie formatieren

z.B.
Anfang + A1 + A2 + B1 + B2 + C1 + C2 + D1 + D2Ende

und jetzt hätte ich es halt so aufgrund der leserlichkeit

Anfang + A1 + A2
............+ B1 + B2
............+ C1 + C2
............+ D1 + D2 Ende

Punkte dienen als Leerzeichenersatz
Antworten