2010-06-02 30 views
1

我試圖在Mac OS X計算機上的文件中執行「查找並替換」操作。雖然它似乎正常工作。看起來該文件有所改變。我使用的文本編輯器(文本牧馬人)完成後無法打開文件。使用Python查找和替換 - 二進制文件

下面是代碼,因爲我有它:

import fileinput 
    for line in fileinput.FileInput("testfile.txt",inplace=1): 
     line = line.replace("newhost",host) 
     print line, 

當我認爲來自終端的文件,但它說「testfile的」可以是二進制文件。無論如何看到它?這個替換是否有可能破壞文件?我有另一種方法可以使用嗎?我非常感謝幫助。

謝謝 亞倫

UPDATE:實際的文件不是.txt文件是一個文件的.plist這是在Mac OS X中的偏好文件,如果有什麼差別

鏈接到的plist文件: http://www.queencitytech.com/plist.zip

回答

0

你的代碼對我很好。但是,我會建議一種不同的方法:不要直接覆蓋文件。我從不喜歡直接更改文件,因爲如果你有一個錯誤或類似的文件丟失。生成一個新文件,然後手動複製它(或者在python中,如果你真的想的話)。

PATH = 'testfile.txt' 
FILE = open(PATH) 
OUT_FILE = open('out_' + PATH, 'w') 

for line in FILE.readlines(): 
    print >> OUT_FILE, line.replace('newhost', host), 
+1

我的代碼也適用於我,但就像我說過的,它似乎改變了文件,而不僅僅是文本。我正在嘗試你的方法,看看它是否有不同的反應。但是,它給了我一個TypeError:不能連接'str'和'file'對象。任何想法什麼是錯的?謝謝,亞倫 – Aaron 2010-06-02 16:04:46

+0

糟糕 - 修好了。 – 2010-06-02 16:34:03

+0

這確實修復了錯誤。但輸出文件仍然不想在編輯器中打開,並且程序無法識別。我添加了一個鏈接到我正在改變的實際文件。我只替換'newhost'。 有一件事我注意到了,如果我通過終端手動編輯文件並替換'newhost'並保存更改。這也不會讓我在編輯器或應用程序(iChat)中打開。 – Aaron 2010-06-02 16:54:12

0

嘗試使用sys.stdout.write而不是打印。 readlines()在讀取行的末尾保留新的行字符。 print語句添加了一個額外的新行字符,所以它可能會使文件雙倍分隔。

+0

這個問題實際上與處理事實有關。plist文件是二進制文件,不能像普通文本文件 – Aaron 2010-06-02 18:12:09

+0

那樣根據我的mac上的fopen手冊頁進行編輯,'b'被忽略。 UNIX系統不會做出區分。 – 2010-06-02 18:21:23

+0

在十六進制編輯器中查看文件時,直接在字符串「[email protected]」之前的字節是字符串的長度。嘗試將其修改爲新字符串的長度。 – 2010-06-02 18:50:00