neue Zeile in ein File einfügen

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
Dummy
User
Beiträge: 5
Registriert: Mittwoch 10. Januar 2007, 07:31

Ich bin in Sachen Python ein absoluter Neuling und schreibe gerade an meinem ersten Script. Ich will ein File nach einem bestimmten Suchstring durchsuchen und wenn ich die entsprechende Zeile gefunden habe, möchte ich dahinter eine neue Zeile mit best. Inhalt einfügen. Leider wird mit meinem Script die Zeile immer am Schluss der Datei eingefügt.
Mein Script sieht wie folgt aus:

Code: Alles auswählen

def modifyTableFile(self,file,setVal):
    	newLineBase = "private int[] attributeIndex = new int[] {"
        newLineFirst = "-1"
        newLineSuff = ""
        count = len(setVal)
        i =0
        while i < count:
            newLineSuff = newLineSuff + "," + setVal[i]
            i = i + 1
        newLine = newLineBase + newLineFirst + newLineSuff +"}" 
        file = open(file,'r+')
        for line in file.readlines():
	    if line.find ("{"):
	    	line = line + newLine + "\n"
            file.write(line)
            break
    file.close()
Kann mir jemand helfen????
BlackJack

Der Quelltext ist nicht richtig einegrückt. Kann es sein dass Du Tabulatorzeichen benutzt? Üblich sind 4 Leerzeichen pro Ebene und keine Tabs.

Die Namen sind nicht PEP 8-Konform, das eingebaute `file` wird lokal an etwas anderes gebunden.

Die ``while``-Schleife ist sehr umständlich, da wird viel zuviel von Hand gemacht. Der Wert der neuen Zeile lässt sich auch so zusammenstellen:

Code: Alles auswählen

    new_line = ('private int[] attributeIndex = new int[] { -1,'
                + ','.join(set_val)
                + '}\n')
Dann kommt ein grosses konzeptuelles Problem: Man kann in Dateien nicht einfach eine Zeile einfügen. Dazu müsste der Rest des Inhalts um die Länge der eingefügten Zeile "nach hinten" verschoben werden und das passiert nicht auf magische Weise. Man muss die Datei also einlesen und neu schreiben. Entweder komplett einlesen und dann unter dem gleichen Namen wieder schreiben, oder zeilenweise einlesen und in eine temporäre Datei schreiben und die am Ende umbenennen. Oder besser umgekehrt, die originale Datei umbenennen und unter dem Originalnamen die neue Datei schreiben. Auf diese Weise behält man eine Sicherheitskopie des alten Zustands.

Die Methode benutzt `self` gar nicht, ist also eigentlich eine Funktion.

Code: Alles auswählen

def modify_table_file(filename, set_val):
    new_line = ('private int[] attributeIndex = new int[] { -1,'
                + ','.join(set_val)
                + '}\n')
    
    in_file = open(filename, 'r')
    lines = in_file.readlines()
    in_file.close()
    
    out_file = open(filename, 'w')
    found = False
    for line in lines:
        out_file.write(line)
        if not found and '{' in line:
            out_file.write(new_line)
            found = True
    out_file.close()
Dummy
User
Beiträge: 5
Registriert: Mittwoch 10. Januar 2007, 07:31

Hallo BlackJack,

vielen Dank für die Lösung! Funktioniert prima! Das self habe ich deshalb in die Funktion gepackt, weil er sagt, dass beim Aufruf 3 Argumente übergeben werden, die funktion jedoch nur 2 Argumente hat (wahrscheinlich mache ich prinzipiell was verkehrt).
Ausserdem habe ich auch noch das Problem, dass er mir die "Prints" nicht auf der Konsole ausgibt (hast du eine Ahnung woran das liegen kann?)

Ich habe noch ein weiteres Problem:
Ich möchte eine Datei nach einem bestimmten String durchsuchen und falls der String gefunden wird das letzte "echte" Zeichen dieser Zeile in einer Liste abspreichern.
Habe das Ganze wie folgt codiert, finde aber keinen Treffer:

Code: Alles auswählen

def parse_file(file):
    	set_val = []
    	lastChar = ""
    	file = open(file,'r')
    	for line in file.readlines():
    	    # problem to find Sting!!!
            line = line.strip()
    	    if "// SnmpOID: " in line:   
                print "----- String found!!!!!!!"
                print line
            	length =len(line)
                lastChar = line[length -1]  		
                set_val.append(lastChar)
            return set_val
	    file.close()
Edit (birkenfeld): code-Tags eingefügt.
BlackJack

Dummy hat geschrieben:Funktioniert prima! Das self habe ich deshalb in die Funktion gepackt, weil er sagt, dass beim Aufruf 3 Argumente übergeben werden, die funktion jedoch nur 2 Argumente hat (wahrscheinlich mache ich prinzipiell was verkehrt).
Bei Methoden wird beim Aufruf automatisch das Objekt zu der Methode als erstes Argument übergeben.
Ausserdem habe ich auch noch das Problem, dass er mir die "Prints" nicht auf der Konsole ausgibt (hast du eine Ahnung woran das liegen kann?)
Welche ``print``s? Da waren doch gar keine?
Ich habe noch ein weiteres Problem:
Ich möchte eine Datei nach einem bestimmten String durchsuchen und falls der String gefunden wird das letzte "echte" Zeichen dieser Zeile in einer Liste abspreichern.
Habe das Ganze wie folgt codiert, finde aber keinen Treffer:

Code: Alles auswählen

def parse_file(file):
    	set_val = []
    	lastChar = ""
    	file = open(file,'r')
    	for line in file.readlines():
    	    # problem to find Sting!!!
            line = line.strip()
    	    if "// SnmpOID: " in line:   
                print "----- String found!!!!!!!"
                print line
            	length =len(line)
                lastChar = line[length -1]  		
                set_val.append(lastChar)
            return set_val
	    file.close()
Hier gibt's schon wieder Probleme mit der Einrückung. Das sieht im Beitrag anders aus, als im Editor.

Geh doch mal in Gedanken diesen Code durch:

1. Datei öffnen
2. In einer ``for``-Schleife für jede Zeile:
  3. Schauen ob Zeichenkette enthalten und letztes Zeichen ermitteln
  4. Die Funktion mit ``return`` beenden!

Die Datei wird nicht geschlossen und effektiv wird nur die erste Zeile überprüft.

Noch ein paar Hinweise: Variablen müssen nicht deklariert werden, das ``lastChar = ""`` ist nicht nötig.

Man sollte a) den eingebauten Namen `file` nicht an etwas anderes binden und b) möglichst nicht den gleichen Namen für verschiedene Typen benutzen, also `file` einmal für den Dateinamen und dann für die Datei selber. Das stiftet Verwirrung beim Leser.

Indexe kann man auch relativ zum Ende einer Sequenz angeben. Das hinzufügen des letzten Zeichens lässt sich so schreiben:

Code: Alles auswählen

set_val.append(line[-1])
Dummy
User
Beiträge: 5
Registriert: Mittwoch 10. Januar 2007, 07:31

Nochmal vielen Dank für die prompte Hilfe und die vielen guten Tipps!
Hab das ganze noch mal nach deinen Tipps umgestellt und schon läuft alles!
Werde jetzt ein bisschen weiter codieren. Vielleicht stolpere ich im Laufe des Tages noch über andere Probleme! Melde mich dann wieder.
Antworten