1

我创建了这个搜索和替换程序。但我想对其进行更改,因此我可以一次搜索和替换多个文件。现在,有没有办法让我可以从我选择的任何文件夹或目录中一次选择多个文件。

下面给出了帮助我使用文件对话框窗口选择文件的代码,但给出了错误。你能帮我改正吗?完整的回溯错误是:

Traceback <most recent call last>:
 File "replace.py", line 24, in <module>
 main()
File "replace.py", line 10, in main
 file = tkFileDialog.askopenfiles(parent=root,mode='r',title='Choose a file')
File "d:\Python27\lib\lib-tk\tkFileDialog.py",line 163, in askopenfiles
   ofiles.append(open(filename,mode))
IOError: [Errno 2] No such file or directory: u'E'

这是代码:我终于得到了这个代码,我将'file'更改为'filez',将'askopenfiles'更改为askopenfilenames'。我能够替换我选择的文件中的单词。唯一的问题是当我选择 2 个文件时它不起作用。也许我应该添加一个循环以使其适用于多个文件。但是,这是一种反复试验,我希望能够真正知道它为什么起作用。有没有一本书或其他东西可以帮助我完全理解这个 tkinter 和文件对话框的东西?无论如何,我已经更改了下面的代码以显示现在的工作代码:

#replace.py
import string
def main():
    #import tkFileDialog
    #import re
    #ff = tkFileDialog.askopenfilenames()
    #filez = re.findall('{(.*?)}', ff)
    import Tkinter,tkFileDialog
    root = Tkinter.Tk()
    filez = tkFileDialog.askopenfilenames(parent=root,mode='r',title='Choose a file')
#filez = raw_input("which files do you want processed?")
f=open(filez,"r")
data=f.read()
w1=raw_input("what do you want to replace?")
w2= raw_input("what do you want to replace with?")
print data
data=data.replace(w1,w2)
print data
f=open(filez,"w")
f.write(data)
f.close()


main()

编辑:下面的回复之一给了我关于文件对话框窗口的想法,现在我可以使用 tkinter 窗口选择多个文件,但我无法继续进行替换。它给出了错误。我尝试了不同的方式来使用文件对话框,不同的方式给出了不同的错误。我没有删除其中一种方式,而是在前面放了一个井号,以便发表评论,所以你们可以看看哪个更好。

4

5 回答 5

2

也许你应该看看glob 模块,它可以很容易地找到所有匹配一个简单模式(例如*.txt)的文件。

或者,更简单但对用户不太友好,您当然可以将输入文件名filez视为一个列表,用空格分隔文件名:

for fn in filez.split():
  # your code here, replacing filez with fn
于 2012-11-27T07:29:50.773 回答
1

我宁愿使用命令行而不是输入。

#replace.py

def main():
    import sys
    w1 = sys.argv[1]
    w2 = sys.argv[2]
    filez = sys.argv[3:]
    # ***
    for fname in filez:
        with open(fname, "r") as f:
            data = f.read()
            data = data.replace(w1, w2)
            print data
        with open(fname, "w") as f:
            f.write(data)
if __name__ == '__main__':
    main()

所以你可以调用你的程序

 replace.py "old text" "new text" *.foo.txt

或者

 find -name \*.txt -mmin -700 -exec replace.py "old text" "new text" {} +

如果您想到一个对话框窗口,您可以在 的位置插入以下内容***

if not filez:
    import tkFileDialog
    import re
    ff = tkFileDialog.askopenfilenames()
    filez = re.findall('{(.*?)}', ff)
于 2012-11-27T08:25:05.443 回答
1

您可能想看看 glob 模块。

在您的输入中处理“*”的示例:

#replace.py
import string
import glob

def main():
    filez = raw_input("which files do you want processed?")
    filez_l = filez.split()
    w1=raw_input("what do you want to replace?")
    w2= raw_input("what do you want to replace with?")
    # Handle '*'  e.g. /home/username/* or /home/username/mydir/*/filename
    extended_list = []
    for filez in filez_l:
        if '*' in filez:
           extended_list += glob.glob(filez)
        else:
           extended_list.append(filez)
    #print extended_list
    for filez in extended_list:
        print "file:", filez
        f=open(filez,"r")
        data=f.read()
        print data
        data=data.replace(w1,w2)
        print data
        f=open(filez,"w")
        f.write(data)
        f.close()
main()
于 2012-11-27T07:41:59.087 回答
0

在 python 中逐行打开大文件的一个好技巧:

contents =  map(lambda x: x.next().replace("\n",""),map(iter,FILES))
于 2013-05-24T06:33:17.807 回答
0

为什么不将程序放入 for 循环:

def main():
    files = raw_input("list all the files do you want processed (separated by commas)")
    for filez in files.split(','):
        f=open(filez,"r")
        data=f.read()
        f.close()
        w1=raw_input("what do you want to replace?")
        w2= raw_input("what do you want to replace with?")
        print data
        data=data.replace(w1,w2)
        print data
        f=open(filez,"w")
        f.write(data)
        f.close()

main()
于 2012-11-27T07:25:58.253 回答