2012-05-12 14 views
5

Quiero reemplazar caracteres usando instrucciones de codificación en un archivo de texto.Reemplazar caracteres en un archivo

Mi archivo de texto contiene la línea:

This is a message 

quiero reemplazar a -> e, e -> a, s -> 3

Así que la línea dice:

Thi3 i3 e massega 

He probado el siguiente código, pero solo cambia un carácter en la línea a la vez.

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

Usted debería usar [** 'os.path.join()' **] (http://docs.python.org/library/os.path.html#os.path.join) para componer rutas correctamente. – Johnsyweb

+0

Supongo que la salida esperada es: 'thi3 i3 e ma33ega' ?? –

+0

@AshwiniChaudhary: no hay necesidad de adivinar. La pregunta es explícita. – Johnsyweb

Respuesta

9

Reemplazar esta:

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

con esto:

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

O mejor aún:

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

Su código sólo aparece para intentar reemplazar 'a' con ' e ', no' e 'con' a '. Por eso, es necesario lo siguiente:

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

Tenga en cuenta que el OP parece querer reemplazar 'a -> e 'y' e -> a ', que solo funcionará si se hace en paralelo, porque la ejecución secuencial de los reemplazos conducirá a' tea' - (' a -> e') -> 'tee' - (' e -> a') -> 'taa', que probablemente no sea lo que OP quiere tener. Entonces, reemplazar es la manera incorrecta de hacer esto. – Nobody

+3

+1 para [** 'str.translate()' **] (http://docs.python.org/library/stdtypes.html#str.translate). ¡Este es el camino a seguir! – Johnsyweb

+0

Supongo que se supone que deben lograr eso sin funciones incorporadas. – 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 

o como Robert sugirió, usar un diccionario

>>> 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 

o:

>>> 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

No soy un gran admirador de este enfoque, pero al menos uso un 'dict' en lugar de un montón de condiciones' if'/'else'. – robert

+0

@robert sugerencia implementado –

+0

+1, sugiero que el último sea más legible para un principiante (es decir, un bucle en lugar de una comprensión y si-else en lugar de obtener). – georg

1

funciona bien aquí.

>>> 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. 

Nota: Si desea que el segundo reemplazar a trabajar, debe hacerlo en newcontents:

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

También es posible usar expresiones regulares, así

newcontents = re.sub(r"a","e",contents) 
newcontents = re.sub(r"s","3",newcontents) 
Cuestiones relacionadas