2012-05-12 40 views
5

我想用文本文件中的編碼指令替換字符。替換文件中的字符

我的文本文件包含行:

This is a message 

我想更換a -> ee -> as -> 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') 

您的代碼只出現嘗試 'A' 與'取代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建議實現 –

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