选择多个文件。蟒蛇

时间:2012-11-27 07:21:36

标签: python file select

我已创建此搜索并替换程序。 但我想对它进行更改,因此我可以进行搜索并替换 一次多个文件。 现在,我有办法吗? 一次选择多个文件的选项  从我选择的任何文件夹或目录。

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

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窗口选择多个文件,但我无法继续进行替换。它给出了错误。 我尝试了不同的方法来使用文件对话框,不同的方法给出了不同的错误。我没有删除其中一种方法,而是在前面加上一个哈希标志,以便对它进行评论,这样你们就可以看看哪一个会更好。

5 个答案:

答案 0 :(得分:2)

也许你应该看一下glob module,它可以让所有匹配简单模式的文件(例如*.txt)变得容易。

或者,更简单但更不方便用户,您当然可以将输入文件名filez视为列表,将文件名与空格分隔开来:

for fn in filez.split():
  # your code here, replacing filez with fn

答案 1 :(得分: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()

答案 2 :(得分: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)

答案 3 :(得分: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()

答案 4 :(得分:0)

在python中逐行打开大文件的好方法:

contents =  map(lambda x: x.next().replace("\n",""),map(iter,FILES))