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()

編集: 以下の返信の 1 つは、ファイル ダイアログ ウィンドウについてのアイデアを与えてくれました。現在、tkinter ウィンドウを使用して複数のファイルを選択できますが、置換を進めることはできません。それはエラーを出しています。ファイルダイアログを使用するさまざまな方法を試しましたが、さまざまな方法でさまざまなエラーが発生しています。方法の 1 つを削除する代わりに、ハッシュ記号を前に付けてコメントにするようにしました。

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

おそらく 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 に答える
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 に答える
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 に答える
0

Pythonで巨大なファイルを1行ずつ開くための良いトリック:

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