遍历子文件夹文件?

时间:2016-10-04 00:00:55

标签: python python-3.x

我已经编写了一个脚本来擦除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)  

1 个答案:

答案 0 :(得分: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'),你的代码就会尝试第二次找到名为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)