2016-03-28 24 views
0

üzerinde çalışmış olan dizindeki dosyalar için yapın. Belirli dosya türlerini ararken bir dizinde gezinmek için os.walk kullanıyorum. Bir dosya türü bulunduğunda (örneğin .txt veya .xml), bu tanımı dizeleri değiştirmek için (old diyelim) dosyadaki dizeleri bir sözlükten (new olarak adlandırarak) kullanmak istiyorum. İlk baştaFileInput: Yedek dosyaları sadece

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

, bu döngü vardı.

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='') 

Bu hızlı bir şekilde çalıştı ve içinde old dizeleri bulundu her dosyada new dizeleriyle old dizeleri yerini alacak Ancak, sorunu Komutumda, her dosya için bir .bak dosyası oluşturup bunların içinde old dizeleri bulunup bulunmadığına bakılmaksızın yatıyor.

Sadece .dizeleri içeren dosyalar için bir .bak dosyası oluşturmak istiyorum (yalnızca değiştirmenin yapıldığı dosyalar için). Ben newFiles.append(re.findall('\\b'+old+'\\b',line)) gibi sadece bu dosyalar için FileInput yöntemi kullanabilirsiniz bu şekilde bir şey kullanarak (old dizeleri içeriyordu; böylece tüm dosyaları okuyup sadece eklemek çalıştı, ancak regex bakmak saatler sürüyor.

cevap

1

I don' t regex burada gerekli olduğunu düşünüyorum sadece eksik parçası Yani, aşağıdaki yaklaşımı deneyin dosyası .bak dosyasını oluşturmadan önce old dizeleri içeriyorsa kontrol etmektir.:.! Eğer @ccf teşekkür

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

Bu çalıştı!:) –