Strings ersetzen und neue .txt datei erstellen

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
Jens_J.
User
Beiträge: 12
Registriert: Montag 23. November 2015, 20:21

Hallo,
Ich benötige eure Hilfe: Ich möchte 33 .txt datein erstellen aus der Ursprungsdatei "sub-01-run-1.txt" wobei die strings subs und runs überall ersetzt werden.

Sowas habe ich versucht.

Code: Alles auswählen

import numpy 

subs= ["01", "02", "03", "04", "05", "06", "09", "10","14", "14", "16"]
runs = [1, 2, 3,]

a = open("sub-01-run-1.txt", "r")
b = a.readlines()

for i in range(len(subs)):
    a = open("sub-%s.txt" %subs[i+1], "w"  )
    a.write(b.replace("sub-01", "sub-%s" %subs[i])
    a.close()
Ich denke das Problem wird offensichtlich: Wie nehme ich eine Datei ersetze Strings und erstelle daraus eine neue?
Zuletzt geändert von Anonymous am Freitag 1. Juli 2016, 11:51, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jens_J.: zu einer vollständigen Problembeschreibung gehört dazu, wo jetzt das konkrete Problem liegt. Was tut nicht so, wie Du es erwartest? Was ist statt dessen das Ergebnis? Gibt es eine Fehlermeldung?

Wieso importierst Du numpy? Wiese ist 01 in der Liste enthalten, obwohl Du das gar nicht eingesetzt haben willst? Warum ist "14" doppelt in der Liste?
"for i in range(len(subs))" ist ein Antipattern. Iteriere direkt über die Liste subs. Nenne Deine Variablen sinnvoll. Mit a oder b kann niemand etwas anfangen.
Jens_J.
User
Beiträge: 12
Registriert: Montag 23. November 2015, 20:21

Einige Dinge von denen ich glaubte sie später zu benötigen sind noch drinn. Da es aber bis dahin nicht funktionierte werden die nicht verwendet.
Also so habe ich es grade nochmal probiert. I

Code: Alles auswählen

subs= ["01", "02", "03", "04", "05", "06", "09", "10","14", "14", "16"]

a = open("sub-01-run-1.txt", "r")

for i in range(len(subs)):
	c = open("sub-%s.txt" %subs[i+1], "w" )	
	c.write (open("sub-01-run-1.txt")
	c.write(replace("sub-01", "sub-%s" %subs[i])

a.close()
c.close()
Zuletzt geändert von Anonymous am Freitag 1. Juli 2016, 11:53, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jens_J.: und bekommst jetzt einen SyntaxError. Programmieren ist nicht Raten. Man muß schon wissen, was jede Zeile macht.
Das "subs[i+1]" ist geraten, weil Du nicht willst, dass Deine ursprüngliche Datei überschrieben wird. Das macht aber überhaupt keinen Sinn, das Problem an dieser Stelle lösen zu wollen. Die richtige Lösung wäre 01 gar nicht in subs zu schreiben.

Aus dem Fehler Deines ersten Posts (AttributeError: 'list' object has no attribute 'replace') wird doch schonmal klar, dass b eine Liste ist, Du aber eigentlich einen String möchtest, um die Ersetzung zu machen.

Also versuch mal zu verstehen, was Du da schreibst, und wenn Du etwas nicht verstehst, konkret zu fragen und vor allem auch immer die Fehlermeldungen anzuschauen und zu posten.
Jens_J.
User
Beiträge: 12
Registriert: Montag 23. November 2015, 20:21

Ok, Sorry der Code war sinnlos. Weiß auch nicht was ich da gestern gedacht habe.
ich habs jetzt mal versucht und folgendes sollte mehr Sinn machen.

Code: Alles auswählen

subs= ["01", "02", "03", "04", "05", "06", "09", "10","14", "14", "16"]

for i in range(len(subs)):
             a = open("sub-01-run-1.txt", "r")
             b = a.read()
             b.replace("sub-01", "sub-%s" %subs[i])
             c = open("sub-%s.txt" %subs[i], "w" )
             c.write(b)

a.close()
c.close()
Problem: b.replace, hier wird nichts replaced. Wenn ich den selben Befehl aber im command line eingebe, dann funktioniert es.
Zuletzt geändert von Anonymous am Freitag 1. Juli 2016, 11:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jens_J.: replace liefert ja auch einen neuen String zurück, und ändert den alten nicht (was prinzipiell nicht geht, weil Strings unveränderlich sind).

Code: Alles auswählen

subs = ["01", "02", "03", "04", "05", "06", "09", "10","14", "14", "16"]
with open("sub-01-run-1.txt", "r") as text:
    text = text.read()

for sub in subs:
    with open("sub-%s.txt" % sub, "w" ) as output:
        output.write(text.replace("sub-01", "sub-%s" % sub))
Jens_J.
User
Beiträge: 12
Registriert: Montag 23. November 2015, 20:21

Vielen Dank. Das war hilfreich. Auch wenn nicht nicht ganz verstehe wieso es nicht funktionierte. aber folgender Code geht. Hab jetzt einfach die Zeile b.replace... weggelassen und bei c.write(b.replace(..) dazu geschrieben.


[codebox=pycon file=Unbenannt.txt]subs= ["01", "02", "03", "04", "05", "06", "09", "10","14", "14", "16"]

for i in range(len(subs)):
a = open("sub-01-run-1.txt", "r")
b = a.read()
c = open("sub-%s.txt" %subs, "w" )
c.write(b.replace("sub-01", "sub-%s" %subs))

a.close()
c.close()[/code]

Wofür genau ist dieses with / as nur damit die Datei von alleine geschlossen wird.

Ps: wie setzt ich den code inPython-Codebox-Tags. Damit das nicht immer jemand anderes für mich machen muss?
sebastian0202
User
Beiträge: 168
Registriert: Montag 9. Mai 2016, 09:14
Wohnort: Berlin

War das eine Schulaufgabe?
Hat der Lehrer sich deine Lösung angeschaut?
Antworten