我已创建此搜索并替换程序。 但我想对它进行更改,因此我可以进行搜索并替换 一次多个文件。 现在,我有办法吗? 一次选择多个文件的选项 从我选择的任何文件夹或目录。
下面给出了帮助我使用文件对话框窗口选择文件的代码,但是给出了错误。你能帮我纠正一下吗? 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窗口选择多个文件,但我无法继续进行替换。它给出了错误。
我尝试了不同的方法来使用文件对话框,不同的方法给出了不同的错误。我没有删除其中一种方法,而是在前面加上一个哈希标志,以便对它进行评论,这样你们就可以看看哪一个会更好。
答案 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))