2012-05-12 39 views
5

Tôi muốn thay thế các ký tự bằng cách sử dụng hướng dẫn mã hóa trong tệp văn bản.Thay thế các ký tự trong một tệp

tập tin văn bản của tôi chứa dòng:

This is a message 

Tôi muốn thay thế a -> e, e -> a, s -> 3

Vì vậy, các dòng đọc:

Thi3 i3 e massega 

Tôi đã thử đoạn mã sau nhưng nó chỉ thay đổi một ký tự trong dòng cùng một lúc.

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

Bạn nên sử dụng [** 'os.path.join()' **] (http://docs.python.org/library/os.path.html#os.path.join) để tạo đường dẫn chính xác. – Johnsyweb

+0

Tôi đoán kết quả mong đợi là: 'thi3 i3 e ma33ega' ?? –

+0

@AshwiniChaudhary: Không cần đoán. Câu hỏi là rõ ràng. – Johnsyweb

Trả lời

9

Thay thế này:

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

với điều này:

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

Hoặc tốt hơn:

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

Mã của bạn chỉ xuất hiện để cố gắng thay thế 'a' với ' e ', không phải' e 'với' a '. Cho rằng, bạn cần như sau:

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

Lưu ý rằng OP dường như muốn thay thế 'a -> e' và' e -> a', sẽ chỉ hoạt động nếu được thực hiện song song, vì việc thực thi tuần tự của các thay thế sẽ dẫn đến 'tea' - (' a -> e') -> 'tee' - (' e -> a') -> 'taa', có lẽ là không, cái OP muốn có. Vì vậy, thay thế là sai cách để làm điều này. – Nobody

+3

+1 cho [** 'str.translate()' **] (http://docs.python.org/library/stdtypes.html#str.translate). Đây là con đường để đi! – Johnsyweb

+0

Tôi đoán chúng được cho là đạt được điều đó mà không có chức năng tích hợp sẵn. – 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 

hay như Robert đề nghị, sử dụng một cuốn từ điển

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

hay:

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

Tôi không phải là một fan hâm mộ lớn của phương pháp này, nhưng ít nhất sử dụng một 'dict' thay vì một loạt các điều kiện' if'/'else'. – robert

+0

@robert gợi ý triển khai –

+0

+1, tôi khuyên bạn nên làm cho người cuối cùng dễ đọc hơn đối với người mới bắt đầu (tức là vòng lặp thay vì hiểu và nếu có người khác thay vì nhận được). – georg

1

Hoạt động tốt ở đây.

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

Lưu ý: Nếu bạn muốn thứ hai thay thế để làm việc, bạn nên làm điều đó trên newcontents:

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

Bạn cũng có thể sử dụng regex cũng

newcontents = re.sub(r"a","e",contents) 
newcontents = re.sub(r"s","3",newcontents) 
Các vấn đề liên quan