2016-07-26 169 views
0
文件

我使用下面的代碼上傳使用FTP服務器上的文件進行編輯後:代替替換文本的Python中

import fileinput 

file = open('example.php','rb+') 

for line in fileinput.input('example.php'): 
    if 'Original' in line : 
     file.write(line.replace('Original', 'Replacement')) 

file.close()  

有一兩件事,而不是替換文字的原來的地方,代碼最後加上替換文字,原文地方的文字不變。

此外,它不是隻替換文本,而是打印出整行。任何人都可以請告訴我如何解決這兩個錯誤?

+0

由於您使用的是fileinput,爲什麼不只是'fileinput.input('example.php',inplace = True)'? –

+0

其他行呢? –

+0

@PadraicCunningham這給了一個錯誤。除了使用'fileinput'之外,還有其他一些方法嗎? –

回答

0

1)該代碼在最後添加替換的文本,原始位置的文本保持不變。

由於您使用+信號打開它,因此無法在文件正文中進行替換。這樣它會追加到文件的末尾。

file = open('example.php','rb+') 

但是,如果你想這隻能追加到文檔的末尾。

bypass您可以使用seek()導航到特定行並將其替換。或創建2個文件:input_fileoutput_file


2)另外,而不只是替換的文本,它打印出整條生產線。

這是因爲你使用:

file.write(line.replace('Original', 'Replacement')) 

免費代碼:

我分成2個文件,一個inputfile中和OUTPUTFILE。

首先它會打開ifile並將所有行保存在名爲lines的列表中。其次,它會讀取所有這些行,並且如果'Original'存在,它會replace它。

更換後,它會保存到ofile

ifile = 'example.php' 
ofile = 'example_edited.php' 

with open(ifile, 'rb') as f: 
    lines = f.readlines() 

with open(ofile, 'wb') as g: 
    for line in lines: 
     if 'Original' in line: 
      g.write(line.replace('Original', 'Replacement')) 

然後,如果你願意,你可以os.remove()非編輯的文件有:


更多信息:Tutorials Point: Python Files I/O

+0

感謝您的答案dot.Py,但有沒有辦法做到這一點,而無需創建兩個文件? –

+2

@SanJeetSingh在兩種情況下都使用ifile。首先它會讀取行,然後它會打開example.php輸出,清除它,然後你重新寫入行,留下一個編輯過的文件,但如果出現任何錯誤,可能會出現被破壞的文件。 –

-1

的文件替換的東西只有作品好,如果原件和更換具有相同的大小(以字節爲單位),那麼你可以做

with open('example.php','rb+') as f: 
    pos=f.tell() 
    line=f.readline() 
    if b'Original' in line: 
     f.seek(pos) 
     f.write(line.replace(b'Original',b'Replacement')) 

(在這種情況下b'Original'b'Replacement'不具有相同的大小因此這些文件後,這個看起來很有趣)

編輯:

如果原件和更換是不一樣的大小,有喜歡的插件不同的可能性g字節來填補空白或移動行後的所有內容。

+0

'只有原始文件和替換文件具有相同的大小(以字節爲單位),才能在文件中替換文件。你可以發佈信息來源嗎? –

+0

我剛剛嘗試過's ='abc'; t = s.replace('a','aaa');打印t'並且它工作正常。 –

+0

對於添加/刪除零件的字符串而言,無論如何創建新的零件都不成問題,但如果您想要在文件中添加或刪除一些字節,則必須將所有零件都移動到後面 - 這意味着讀取和寫回大型零件。 – janbrohl

0

第二個錯誤是replace()方法是如何工作的。

它返回整個輸入字符串,只替換指定的子字符串。見示例here

要寫入文件中的特定位置,您應該首先將seek()移至正確的位置。

我覺得這個問題已經在幾個地方問過了,我會快速搜索StackOverflow。

也許this會有幫助嗎?