2012-03-23 8 views
2

私は、フォルダ内のファイルをループし、単純な検索と置き換えを行って、結果を別のフォルダに出力する次のコードを持っています。私が気づいているのは、置換文字列が2回適用されるようです。例えばPythonの検索と置換が文字列の置換を複製していますか?

Search string: foo

Replace string: foo bar

Result: foo bar bar

は、ここに私のコードです。私は問題が明らかだと確信していますが、私はそれに私の指を置くことはできません。

def SearchReplace(directory, search, replace, filePattern): 
    for path, dirs, files in os.walk(os.path.abspath(directory)): 
     for filename in fnmatch.filter(files, filePattern): 
      filepath = os.path.join(path, filename) 
      outfile = os.path.join(outputdir, filename) 
      with open(filepath) as f: 
       s = f.read() 
      s = s.replace(search, replace) 
      with open(outfile, "w") as f: 
       f.write(s) 
SearchReplace(inputdir, searchstr, replacestr, ext) 

注:結果を別のフォルダに出力しないと、検索/置換が期待どおりに実行されます。つまり、下のコードはうまく機能します(同じフォルダ内の入力ファイルを変更します)。

def SearchReplace(directory, search, replace, filePattern): 
    for path, dirs, files in os.walk(os.path.abspath(directory)): 
     for filename in fnmatch.filter(files, filePattern): 
      filepath = os.path.join(path, filename) 
      with open(filepath) as f: 
       s = f.read() 
      s = s.replace(search, replace) 
      with open(filepath, "w") as f: 
       f.write(s) 
SearchReplace(inputdir, searchstr, replacestr, ext) 

ただし、結果を別のフォルダに出力する必要があります。

+1

元のテキストは何ですか?最初に 'foo bar'だった場合... – cha0site

答えて

2

問題は、出力フォルダが入力検索パターンに含まれているため、入力ファイルに対して1回、出力ファイルに対して1回の置換が行われることです。

+1

' outputdir'が '' C:\ stuff \ modified ''で、' inputdir'が '' C:\ stuff "'ならば、あなたのコードC:\ stuff \ modified "に書き込み、' 'C:\ stuff \ modified ''を訪問し、' 'C:\ stuff \ modified ''に書き込みます。 –

+0

ああ...インデントで倒れた。 ありがとう、マーク! :) – Keith

+0

これを回避する方法の1つは、外部ループの真下に 'if outputdir == path:continue'を追加することです。 –

関連する問題