2016-10-04 118 views
2

我已經寫了一個腳本來從docx文件中刪除給定的單詞,並且在我的最後一個檢查子文件夾項目的障礙。有人能幫我弄清楚我在執行中失敗的地方嗎?它適用於同一目錄中的所有文件,但它現在也不會檢查子文件夾項目。謝謝你的幫助。遍歷子文件夾文件?

#!/usr/bin/env python3 

# Search and Replace all docx 

import os, docx 

from docx import Document 


findText = input("Type text to replace: ")        

#replaceText = input('What text would you like to replace it with: ')  


for dirs, folders, files in os.walk('.'): 
    for subDirs in dirs: 
     print('The Sub is ' + subDirs) 
     for fileNames in files: 
      print(subDirs + fileNames) 
      if fileNames.endswith('.docx'): 
       newDirName = os.path.abspath(subDirs) 
       fileLocation = subDirs + '\\' + fileNames 
       document = docx.Document(fileLocation) 
       print('Document is:' + fileLocation) 

       tables = document.tables 
       for table in tables: 
        for row in table.rows: 
         for cell in row.cells: 
          for paragraph in cell.paragraphs: 
           if findText in paragraph.text:        
            inline = paragraph.runs         
            for i in range(len(inline)): 
             if findText in inline[i].text: 
              text = inline[i].text.replace(findText, '') 
              inline[i].text = text 

       for paragraph in document.paragraphs:       
        if findText in paragraph.text:        
         inline = paragraph.runs         
         for i in range(len(inline)): 
          if findText in inline[i].text: 
           text = inline[i].text.replace(findText, '') 
           inline[i].text = text 

       document.save(fileLocation) 
+0

你說_it不會也檢查子文件夾items_ - 這是否意味着實際的docx處理是不相關的。你能把這個樣本修剪成一些仍然失敗但不會讓我們眼睛疲勞的東西嗎?! – tdelaney

+1

'os.walk'走樹,所以你可能不需要爲子目錄中的子目錄:'它只是對子目錄進行第二次瀏覽。 – tdelaney

+0

'dirs'將是一個字符串,即當前目錄,因此當您爲'dirs'中的子目錄執行時,您正在迭代字符串中的單個字符。 –

回答

3

os.walk遍歷子目錄產生一個3元組對(dirpath, dirnames, filenames)每個子目錄訪問。當你這樣做:

for dirs, folders, files in os.walk('.'): 
    for subDirs in dirs: 

事情變得非常錯誤。 dirs是每個迭代中子目錄的名稱,這意味着for subDirs in dirs:實際上是枚舉目錄名稱中的字符。恰巧你迭代的第一個目錄是".",並且運氣好的話它只有一個字符目錄名,這樣你的for循環似乎就可以工作。

只要你走進另一個子目錄(可以稱其爲「富」),你的代碼將嘗試找到子目錄稱爲foo\ffoo\ofoo\o第二次。這是行不通的。

但你不應該自己重新枚舉子目錄。 os.walk已經做到了。把你的代碼放到枚舉部分,這會找到子樹中的所有.docx

#!/usr/bin/env python3 

import os 

for dirpath, dirnames, filenames in os.walk('.'): 
    docx_files = [fn for fn in filenames if fn.endswith('.docx')] 
    for docx_file in docx_files: 
     filename = os.path.join(dirpath, docx_file) 
     print(filename) 
+0

嘿tdelany,這是一個了不起的解釋,它完美的工作。對眼睛緊張的道歉。你的解決方案是如此優雅的方法。如果你不介意你能否打破基準名行。看起來好像你有多行代碼,並且一次完成。再次感謝你的幫助。 – TragicWhale

+0

我擴大了操作並使用了明智的名字。 – tdelaney

+0

不知道那是什麼,但至少我知道該看什麼......哈。再次,非常感謝。這是爲了工作,所以它會爲我節省很多時間。 – TragicWhale