2012-05-12 14 views
5

Ich möchte Zeichen mithilfe von Codierungsanweisungen in einer Textdatei ersetzen.Ersetzen von Zeichen in einer Datei

Meine Textdatei enthält die Zeile:

This is a message 

I a -> e, e -> a ersetzen wollen, s -> 3

So ist die Zeile liest:

Thi3 i3 e massega 

ich den folgenden Code versucht, aber Es ändert nur jeweils ein Zeichen in der Zeile.

import sys 
import codecs 

def encode(): 
    path = "C:\Users\user\Desktop" 
    basename = "assgn2part1.txt" 
    filename = path + "\\" + basename 
    #file = open(filename, "rt") 
    f = codecs.open(filename,encoding='utf-8') 
    contents = f.read() 


    print contents ,"\n" 
    newcontents = contents.replace('a','e') 
    newcontents = contents.replace('s', '3') 

    print newcontents 


    f.close() 
+1

Sie verwenden könnten sollte [** 'os.path.join()' **] (http://docs.python.org/library/os.path.html#os.path.join) zum korrekten Erstellen von Pfaden verwenden. – Johnsyweb

+0

Ich glaube die erwartete Ausgabe ist: 'thi3 i3 e ma33ega' ?? –

+0

@AshwiniChaudhary: Keine Notwendigkeit zu erraten. Die Frage ist explizit. – Johnsyweb

Antwort

9

das Ersetzen:

newcontents = contents.replace('a','e') 
newcontents = contents.replace('s', '3') 

mit diesem:

newcontents = contents.replace('a','e') 
newcontents = newcontents.replace('s', '3') 

Oder noch besser:

newcontents = contents.replace('a','e').replace('s', '3') 

Ihr Code erscheint nur 'a' mit dem Ersetzen zu versuchen ' e ', nicht' e 'mit' a '. Dafür müssen Sie die folgenden Schritte aus:

import string 
newcontents = contents.translate(string.maketrans("aes", "ea3")) 
+3

Beachten Sie, dass das OP anscheinend "a -> e" und "e -> a" ersetzen möchte, was nur bei paralleler Ausführung funktioniert, da die sequentielle Ausführung der Ersetzungen zu 'tea' - (' a -> e') -> 'tee' - (' e -> a') -> 'taa', was wahrscheinlich nicht ist, was der OP haben möchte. Ersetzen ist also der falsche Weg. – Nobody

+3

+1 für [** 'str.translate()' **] (http://docs.python.org/library/stdtypes.html#str.translate). Das ist der Weg! – Johnsyweb

+0

Ich denke, dass sie das ohne eingebaute Funktionen erreichen sollen. – georg

3
>>> strs="this is a message" 
>>> strs="".join(['a' if x=='e' else 'e' if x=='a' else '3' if x=='s' else x for x in strs]) 
>>> print(strs) 
thi3 i3 e ma33ega 

oder als Robert vorgeschlagen, verwenden Sie ein Wörterbuch

>>> strs="this is a message" 
>>> dic={'a':'e','e':'a','s':'3'} 
>>> strs="".join((dic.get(x,x) for x in strs)) 
>>> print(strs) 
thi3 i3 e ma33ega 

oder:

>>> strs="this is a message" 
>>> dic={'a':'e','e':'a','s':'3'} 
>>> new_strs='' 
>>> for x in strs: 
    if x in dic: 
     new_strs += dic[x] 
    else: 
     new_strs += x 
>>> print(new_strs) 

thi3 i3 e ma33ega 
+1

Ich bin kein großer Fan von diesem Ansatz, aber zumindest ein 'dict' anstelle von einer Reihe von' if'/'else' Bedingungen. – robert

+0

@robert Vorschlag implementiert –

+0

+1, würde ich vorschlagen, die letzte für einen Anfänger lesbarer machen (d. H. Eine Schleife statt eines Verständnisses und wenn - sonst statt zu bekommen). – georg

1

fein hier funktioniert.

>>> import codecs 
>>> contents = codecs.open('foo.txt', encoding='utf-8').read() 
>>> print contents 
This is a message. 

>>> print contents.replace('s', '3') 
Thi3 i3 a me33age. 

Hinweis: Wenn Sie die zweite ersetzen arbeiten möchten, sollten Sie es auf newcontents tun:

newcontents = contents.replace('a','e') 
newcontents = newcontents.replace('s', '3') 
0

Sie auch Regex auch

newcontents = re.sub(r"a","e",contents) 
newcontents = re.sub(r"s","3",newcontents) 
Verwandte Themen