2010-06-02 144 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