2012-05-12 3 views
5

Я хочу заменить символы, используя инструкции кодирования в текстовом файле.Замена символов в файле

Мой текстовый файл содержит строку:

This is a message 

Я хочу, чтобы заменить a -> e, e -> a, s -> 3

Так строка:

Thi3 i3 e massega 

Я попытался следующий код, но он меняет только один символ в строке за один раз.

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

Вы следует использовать [** 'os.path.join()' **] (http://docs.python.org/library/os.path.html#os.path.join) для правильного составления путей. – Johnsyweb

+0

Я предполагаю, что ожидаемый результат: 'thi3 i3 e ma33ega' ?? –

+0

@AshwiniChaudhary: Не нужно угадывать. Вопрос очевиден. – Johnsyweb

ответ

9

Заменить это:

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

с этим:

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

Или еще лучше:

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

Ваш код только кажется попытка заменить 'а' с " e ', а не' e 'с' a '. Для этого необходимо следующее:

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

Обратите внимание, что OP, похоже, хочет заменить 'a -> e' и' e -> a', который будет работать, только если выполняется параллельно, поскольку последовательное выполнение заметок приведет к 'tea' - (' a -> e') -> 'tee' - (' e -> a') -> 'taa', чего, вероятно, нет, чего хочет OP. Таким образом, замена - неправильный способ сделать это. – Nobody

+3

+1 для [** 'str.translate()' **] (http://docs.python.org/library/stdtypes.html#str.translate). Это * * путь! – Johnsyweb

+0

Я предполагаю, что они должны достичь этого без встроенных функций. – 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 

или как Роберт предложил, использовать словарь

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

или:

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

Я не большой поклонник этого подхода, но, по крайней мере, использую 'dict' вместо связки условий' if'/'else'. – robert

+0

Предложение @robert implemeted –

+0

+1, я предлагаю сделать последнее более читаемым для новичка (т. Е. Цикл вместо понимания и if-else вместо get). – georg

1

прекрасно работает здесь.

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

Примечание: Если вы хотите второй заменить на работу, вы должны делать это на newcontents:

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

Вы также можете использовать регулярные выражения, а также

newcontents = re.sub(r"a","e",contents) 
newcontents = re.sub(r"s","3",newcontents) 
Смежные вопросы