Seite 1 von 2

Zeilen anhängen bis Ende gefunden wird

Verfasst: Mittwoch 8. August 2007, 13:12
von madthomas
Hallo ich muss ein Programm schreiben welches ein Datei einliest und
diese nach bestimmten Kriterien überprüft

hab das mal jetzt so versucht aber er stürzt immer ab

Code: Alles auswählen

in_file = open("Datei", "r")
out_file = open("Geänderte Datei", "w")

def eingabe(zeile):
    for zeile in in_file:
        return(zeile)


def zuAendern(zeile):
    if zeile.find("Anfang")!=-1 and zeile.find("Zusatz für Anfang")!=-1 and zeile.find('Ende')!=-1:
        out_file.write(zeile)
        eingabe(zeile)

    elif zeile.find("Anfang")!=-1 and zeile.find("Zusatz für Anfang")!=-1:
        while zeile.find('Ende')==-1:
            eingabe(zeile)
            zeile.strip()
        out_file.write(zeile)

    else:
        out_file.write(zeile)
        
           

for zeile in in_file:
    zuAendern(zeile)
    print zeile,       

        
out_file.close()
in_file.close()


Verfasst: Mittwoch 8. August 2007, 13:20
von tromai
Stürzt er wirklich ab oder bekommst du eine Fehlermeldung?
In der letzten Zeile fehlt ein Underscore zwischen 'in' und 'file'. Wenn du den Code kopiert hast dürfte es unter Umständen daran liegen.

Verfasst: Mittwoch 8. August 2007, 13:22
von madthomas
IDLE von Python stürtz ab und die cmd auch

Nein da fehlt keiner den sieht man nur schlecht und er würde es ja melden

Verfasst: Mittwoch 8. August 2007, 13:26
von tromai
Ok, sorry. Er wird bei mir nicht angezeigt.

Verfasst: Mittwoch 8. August 2007, 13:42
von madthomas
Jetzt müsste er aber zu sehen sein

Verfasst: Mittwoch 8. August 2007, 13:48
von mawe

Code: Alles auswählen

for zeile in in_file:
    zuAendern(zeile)
Du iterierst hier über die Zeilen der Datei, rufst zuAendern auf, wo eingabe aufgerufen wird, und dort wird nochmals mit for zeile in in_file über die Datei iteriert. Kein Wunder dass Python hier streikt, da würde doch jeder wahnsinnig werden :)

Verfasst: Mittwoch 8. August 2007, 13:51
von madthomas
Ok da hast du wohl recht aber gibt ein möglichkeit dem Programm zu sagen das er die nächste Zeile anhängt und die nochmal überprüft

Re: Zeilen anhängen bis Ende gefunden wird

Verfasst: Mittwoch 8. August 2007, 14:17
von schlangenbeschwörer
Hi!
madthomas hat geschrieben:

Code: Alles auswählen

def eingabe(zeile):
    for zeile in in_file:
        return(zeile)
Was macht das? 1. Ist das Argument doch überflüssig, da es eh nicht gebraucht wird, 2. ist die ganze Funktion doch überflüssig, da doch nach der ganzen Iritiererrei doch eh nix bei rauskommt. Noch macht die Funktion wirklich was, noch gibt sie was zurück was aber auch nicht verarbeitet werden würde.

Verfasst: Mittwoch 8. August 2007, 14:19
von tromai
Ich hoffe, dass ich richtig verstanden habe, aber wenn du über das File iterieren willst, dann mach es doch so:

Code: Alles auswählen

for zeile in in_file:
   if zeile == blablabla:
      mache irgendwas
      continue
   elif zeile == blablöbla:
      mache irgendwas anderes
      continue
   else:
      mache irgendwas ganz anderes
      break

Verfasst: Mittwoch 8. August 2007, 14:54
von EyDu
@tromai: Die continue- und break-Statements in deinem Beispiel sind überflüssig.

Verfasst: Mittwoch 8. August 2007, 14:55
von tromai
Öhm, das passiert wenn man in Eile ist und trotzdem helfen will.
Ist natürlich Quark. :oops: :oops: :oops:

Verfasst: Mittwoch 8. August 2007, 15:32
von BlackJack
@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.

Verfasst: Mittwoch 8. August 2007, 21:54
von DatenMetzgerX
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.

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 für Anfang' in line and not 'Ende' in line:
            line = line.strip()
        out_file.write(line)
  
    in_file.close()
    out_file.close()

Verfasst: Donnerstag 9. August 2007, 06:32
von madthomas
Danke für die Hife nur mein Problem ist das die nächste wenn die Zeile geändert werden muss nicht immer das Ende in der nächsten Zeile ist sondern noch weitere folgen bis das ende kommt und deswegen muss ich eine schleife bauen ich weiß aber nicht wie ich das anstellen kann

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 für Anfang' in line and not 'Ende' in line:
                line = line.strip()
               #überprüfen und tue das bis ende gefunden
                     line = line.strip()
                   
        out_file.write(line)
 
    in_file.close()
    out_file.close()


Verfasst: Donnerstag 9. August 2007, 08:33
von Sr4l
madthomas hat geschrieben:Danke für die Hife nur mein Problem ist das die nächste wenn die Zeile geändert werden muss nicht immer das Ende in der nächsten Zeile ist sondern noch weitere folgen bis das ende kommt und deswegen muss ich eine schleife bauen ich weiß aber nicht wie ich das anstellen kann
Ich verstehe den ganzen Absatz nicht so ganz, deshalb bitte ich um Entschuldigung für meine allgemeine Antwort zum Thema Schleifen :-).

Mit `for line in in_file` hast du schon eine for-Schleife, aber so könnten andere Schleifen aussehen:

Code: Alles auswählen

for x in range(5):
   print x

i = 0
while i < 20:
    print i
    i += 1

Verfasst: Donnerstag 9. August 2007, 09:24
von madthomas
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()

Verfasst: Donnerstag 9. August 2007, 10:20
von 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.

Verfasst: Donnerstag 9. August 2007, 12:51
von mkesper
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.

Verfasst: Donnerstag 9. August 2007, 13:55
von madthomas
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

Verfasst: Donnerstag 9. August 2007, 14:25
von mkesper
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. :)