2016-03-28 7 views
0

os.walkを使用して、特定のファイルタイプを検索するディレクトリを表示しています。ファイルタイプが見つかったら(txtや.xmlなど)、この定義を使用してファイル内の文字列(oldと呼ぶ)を辞書の文字列(newと呼ぶ)に置き換えます。まずFileInput:作業中のディレクトリ内のファイルのみのバックアップファイルを作成します。

def multipleReplace(text, wordDict): 
    for key in wordDict: 
     text = text.replace(key, wordDict[key]) 
    return text 

、私はこのループを持っていた:

myDict = #dictionary with keys(old) and values(new)# 
home = #some directory# 
for dirpath, dirnames, filenames in os.walk(home): 
    for Filename in filenames: 
     filename = os.path.join(dirpath, Filename) 
     if filename.endswith('.txt') or filename.endswith('.xml'): 
       with fileinput.FileInput(filename,inplace=True,backup='.bak') as file: 
        for line in file: 
         print(multipleReplace(line,myDict),end='') 

これはすぐに働いて、それがでold文字列を発見したすべてのファイルにnewの文字列とold文字列に代わるしかし、問題は。私のスクリプトの中には、たとえファイルにoldという文字列が含まれているかどうかにかかわらず、すべてのファイルの.bakファイルが作成されています。

old文字列を含むファイル(置換が行われたファイルのみ)にのみ.bakファイルを作成したいとします。 永遠に取り、私はそれらのファイルだけのためにFileInputクラスのメソッドを使用することができます方法newFiles.append(re.findall('\\b'+old+'\\b',line))のようなものを使用して(すべてのファイルを読むだけold文字列が含まれているものを追加しようとしたが、正規表現を見上げる。

答えて

1

私はドン」 。トンザ・唯一欠けている部分がファイルの.bakファイルを作成する前old文字列が含まれているかどうかを確認することである正規表現はここでは必要だと思うので、次のアプローチを試してみてください:。!

def multipleReplace(text, wordDict): 
    for key in wordDict.keys(): # the keys are the old strings 
     text = text.replace(key, wordDict[key]) 
    return text 

myDict = #dictionary with keys(old) and values(new)# 
home = #some directory# 
for dirpath, dirnames, filenames in os.walk(home): 
    for Filename in filenames: 
     filename = os.path.join(dirpath, Filename) 
     if filename.endswith('.txt') or filename.endswith('.xml'): 
      with open(filename, 'r') as f: 
       content = f.read() # open and read file content 
      if any([key in content for key in wordDict.keys()]): # check if old strings are found    
       with fileinput.FileInput(filename,inplace=True,backup='.bak') as file: 
        for line in file: 
         print(multipleReplace(line,myDict), end='') 
+0

これは働いていたあなたが@ccfありがとう! ) –

関連する問題