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?
bestimmte Zeilen in einem File ändern
-
- 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
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
Ich hätte probiert es so zu lösen. Allerdings funktioniert es nicht ganz.
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?
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()
@Spontifixus
Wie soll das gehen, mittels Zeilenindex auf x.readlines() zugreifen zu können? Hast du vielleicht ein Beispiel parat?
DeineDatei.readlines gibt dir eine Liste wieder. Auf die kannst du nun ganz normal mit Indizes arbeiten.
So kriegst du die ersten beiden Zeilen:
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/
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.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)) ...
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.
Ungetestes Gerüst zum Anpassen:@Spontifixus
Wie soll das gehen, mittels Zeilenindex auf x.readlines() zugreifen zu können? Hast du vielleicht ein Beispiel parat?
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()