bestimmte Zeilen in einem File ändern

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
cle1986
User
Beiträge: 18
Registriert: Donnerstag 7. September 2006, 12:44

Hallo Leute!

Ich möchte in einem python File bestimmte Zeilen ändern, dh diese Zeilen sollen mit einem # versehen werden und das File anschliessend ausgeführt werden.

Ich habe es geschafft das File mit open zu öffnen, die Zeilen zwischen 2 bestimmten Textabschnitten einzulesen und dem User die Möglichkeit zu geben, welche Abschnitte ausgeführt werden sollen oder nicht auszuwählen.

Allerdings kann ich die ausgewählten Passagen nicht auf das zu modifizierende File übertragen.

Meine Überlegungen:

1) Die Zeilennummern speichern und die Zeilen individuell bearbeiten.
Das brachte eine Fehlanzeige, da ich nicht weiss, wie ich das anstelle. Ich habe zumindest keine Funktion gefunden, die bestimmte Zeilen ändert.

2) Die Zeichennummern der Zeilenanfänge zu speichern. Dazu verwendete ich die Funktion f.tell(). Diese gibt allerdings nur Byte wieder und keine Zeichennummern.

Somit stehe ich mal an. Weiss jemand vielleicht eine Lösung?
Spontifixus
User
Beiträge: 9
Registriert: Donnerstag 3. August 2006, 12:33

Moin,

Wenn du eine geöffnete Datei mit DeinFile.readlines() einliest, kannst du och bequem per Zeilenindex zugreifen?

Dann kannst du darüberiterieren, die gewünschten Zeilen verändern und das ganze mit NeuesFile.writelines(DeinReadlinesArray) wieder in eine Datei spiechern...

Gruß,
Markus :)
cle1986
User
Beiträge: 18
Registriert: Donnerstag 7. September 2006, 12:44

Ich hätte probiert es so zu lösen. Allerdings funktioniert es nicht ganz.

Code: Alles auswählen

def dataforstart(self,evt):
        self.win.EndModal(0)
        fileobj = file(self.filet.GetValue(),'r+')
        read = fileobj.readline()
        n = 0
        counter = 0
        while True:
            if read == self.listbox.GetString(n):
                if self.listbox.IsSelected(n)==True:
                    n=n+1
                    counter = 0
                else:
                    aa = str('#'+read)
                    fileobj.write(read.replace(read, aa))
                    n=n+1
                    counter = 0
            elif read == '':
                counter = counter+1
                if counter > 2:
                    break
            else:
                counter = 0
            read = fileobj.readline()
        fileobj.close()
        self.start()
Das Problem ist, es ist egal, welche Daten man auswählt, es wird immer nur die Zeile 2 geändert und sonst nichts. Ausgenommen, wenn alles ausgewählt wurde.

@Spontifixus

Wie soll das gehen, mittels Zeilenindex auf x.readlines() zugreifen zu können? Hast du vielleicht ein Beispiel parat?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

DeineDatei.readlines gibt dir eine Liste wieder. Auf die kannst du nun ganz normal mit Indizes arbeiten.
So kriegst du die ersten beiden Zeilen:

Code: Alles auswählen

f = file(DeineDatei, "r+")
firstline, secondline = f.readlines()[:1]
http://www.cs.unm.edu/~dlchao/flake/doom/
BlackJack

cle1986 hat geschrieben:Ich hätte probiert es so zu lösen. Allerdings funktioniert es nicht ganz.

Code: Alles auswählen

                    ...
                else:
                    aa = str('#'+read)
                    fileobj.write(read.replace(read, aa))
                    ...
Davon abgesehen, das es nicht funktioniert ist es ziemlich umständlich. Du erzeugst eine Zeichenkette mit einem führenden '#' und dann führst Du eine Ersetzung durch die *immer* die gleiche Zeichenkette wie `aa` als Ergebnis hat. Da kannst Du gleich `aa` nehmen.

Das Hauptproblem ist aber das man Zeilen in einer Textdatei in der Regel nicht "in place" verändern kann. Selbst wenn Du das `write()` an der richtigen Stelle in der Datei machen würdest, ist die veränderte Zeile ein Zeichen länger, das heisst der Schreibvorgang überschreibt das erste Zeichen der folgenden Zeile.
@Spontifixus

Wie soll das gehen, mittels Zeilenindex auf x.readlines() zugreifen zu können? Hast du vielleicht ein Beispiel parat?
Ungetestes Gerüst zum Anpassen:

Code: Alles auswählen

def test(filename):
    lines = open(filename, 'r')
    result = list()
    for line in lines:
        if whatever_test():
            result.append('#' + line)
        else:
            result.append(line)
    lines.close()
    out_file = open(filename, 'w')
    out_file.writelines(result)
    out_file.close()
Antworten