buchstabe durch einen anderen ersetzen (anfängerfrage)

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
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

Hi leuts
Ich will in einer textdatei ein Buchstabe durch einen anderen ersetzen lassen.
z.B. wenn in der Textdatei 25 mal ein a drin ist soll jedes a zu einem b umgeschrieben werden. dazu hatte ich mir das überlegt:

Code: Alles auswählen

# -*- coding: cp1252 -*-
def ersetzer (zeile):
    text = ''
    for i in range( len(zeile) ):
        if zeile[i] == 'a':
            text = text + 'f'
        else:
            text = text + zeile[i]
    return text

# ausprobieren:
datei = open("text.txt", "w")
testzeile = datei.readlines()
print testzeile
print
print sonderzeichen(testzeile)
datei.write(sonderzeichen(testzeile))

ersetzer()
Doch da kommt immer ein Error :
[Errno 9] Bad file descriptor
???
warum bad file descriptor?
vieleicht könnt ihr mir ja helfen.
Schon mal vielen Dank

Gruß Teabag
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Der bad filedescriptor bedeutet, dass du die Datei zum schreiben oeffnest, aber lesen willst (oder umgekehrt). Das 'w' bei open sollte in deinem Fall ein 'wr' sein. Uebrigens ist es meist keine gute Idee, in eine Datei gleichzeitig zu schreiben und davon zu lesen, da die Position, wo man sich in der Datei befindet, bei beiden Operationen geaendert wird und es ein Kuddelmuddel geben kann.

Und kennst du schon replace?

Code: Alles auswählen

>>> "asdfasdfasdf".replace("a", "!")
'!sdf!sdf!sdf'
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

aber der error bezieht sich auf was anderes!:

Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Raphael1\Desktop\hm.py", line 13, in <module>
testzeile = datei.readlines()
IOError: [Errno 9] Bad file descriptor

Schon mal danke für die antwort

Gruß Teabag
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo Teabag!

Vielleicht solltest du dir kurz die Zeit nehmen um das hier durchzulesen: http://www.python-forum.de/topic-6157.html

Wenn du dann noch fragen hast -- einfach melden. :-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Teabag hat geschrieben:aber der error bezieht sich auf was anderes!:

Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Raphael1\Desktop\hm.py", line 13, in <module>
testzeile = datei.readlines()
IOError: [Errno 9] Bad file descriptor
Nein, das ist genau das, was ich meine. Du versuchst mit readlines von einer Datei zu lesen, die du nur zum Schreiben geoeffnet hast.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

hi
wenn ich das jetzt mit replace versuche so:

Code: Alles auswählen

datei = open("text.txt", "wr")
testzeile = datei.readlines()
teszeilen.replace("a", "f")
dann kommt zum einem immer noch file descriptor error und wenn ich nur r statt wr nehme kommt:
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Raphael1\Desktop\hm.py", line 14, in <module>
testzeile.replace("a", "f")
AttributeError: 'list' object has no attribute 'replace'
kann man das bei so was nicht machen? (ich meine das replace) ?
Aber danke für die antworten ;-)

Gruß Teabag
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Upps, es muss 'w+' heisse. :oops:

readlines liefert dir eine Liste zurueck, replace gibt es nur auf strings. Du kannst z.B. die ganze Textdatei mit read() einlesen, oder du muss replace auf jede Zeile einzeln anwenden.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Teabag
User
Beiträge: 81
Registriert: Sonntag 13. Mai 2007, 20:44

Achso ok, np
Doch ich habe jetzt das:

Code: Alles auswählen

# -*- coding: cp1252 -*-
def ersetzer (zeile):
    text = ''
    for i in range( len(zeile) ):
        if zeile[i] == 'a':
            text = text + 'f'
        else:
            text = text + zeile[i]
    return text

# ausprobieren:
datei = open("text.txt", "w+")
testzeile = datei.readlines()
datei.write(ersetzer(testzeile))
es kommt kein error mehr, doch in der textdatei steht hinterher einfach gar ncihts mehr ???

Gruß Teabag
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Den entscheidenen Tipp hat Dir Rebecca ganz am Anfang gegeben: Öffne zwei Dateien: Eine zum Lesen und eine zum Schreiben. Wenn die in Frage kommende Datei rel. klein ist, kannst Du das sicher auch im Speicher machen.

Außerdem kannst Du ruhig die replace Funktion benutzen. Die funktioniert auch, wenn Du sie nicht auf Listen anwendest, sondern auf Strings. Hinweis: readlines() liefert eine Liste von Strings.

Lies' doch mal das Tutorial. Das dauert nicht so furchtbar lange und es werden Dir Schuppen von den Augen fallen!

Gruß,
Christian
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Und wie schon gesagt, kannst du deine gesamte Funktion "ersetzer" durch replace ersetzen:

Code: Alles auswählen

datei.write(testzeile.replace("a", "f"))
weniger zu schreiben, besser zu lesen, und effizienter/schneller
Antworten