嵌套文件夹结构中的Excel工作表中的递归数据抓取

时间:2018-06-10 21:22:41

标签: python-3.x recursion openpyxl

请帮帮我。我想遍历一个看起来像这样的目录结构:

Topdir> subdir 1> excel 1/2/3

Topdir> subdir 2> excel 4

我正在抓取excel的B列中的字符串,这很好用。但是,我的脚本只能通过topdir,而不会进入子目录。以下是我的代码:

import openpyxl, os, sys, warnings, glob

warnings.simplefilter("ignore")
targetString = str("Sample Error")
scriptPath = os.path.abspath(__file__)
outputFile = open('logging.txt', "w+")


def scrapeSheets():
    for i in os.listdir(path='.'):
        if i.endswith("data-eval.xlsm"):
            print("Working on:", i)
            wb = openpyxl.load_workbook(i, data_only=True)
            sheet = wb["data-sheet"]
            outputFile.write("{}\n".format(i))
            for cellObj in sheet["B"]:
                if cellObj.value == targetString:
                    print(cellObj.row, cellObj.value)
                    outputFile.write("\t{}\t{}\n".format(cellObj.row, cellObj.value))

def mainLoop():
    for filename in glob.iglob('**/*.xlsm', recursive=True):
        scrapeSheets()

if __name__ == "__main__":
    mainLoop()

正如我所说,抓取工作,但我不能进入子文件夹。我预感它与线

有关
 for i in os.listdir(path='.')

但是,我不知道使循环的变量递增的解决方案。

2 个答案:

答案 0 :(得分:0)

您可以尝试这样:

    for dirname in os.listdir(path='.'):
        for main_dir, dirs, files in os.walk(dirname):
            for f in files:
                if f.endswith("data-eval.xlsm"):
                    print("Working on:", f)
                    wb = openpyxl.load_workbook(f, data_only=True)
                    sheet = wb["data-sheet"]
                    outputFile.write("{}\n".format(i))
                    for cellObj in sheet["B"]:
                        if cellObj.value == targetString:
                            print(cellObj.row, cellObj.value)
                            outputFile.write("\t{}\t{}\n".format(cellObj.row, cellObj.value))

说明:

使用listdir遍历目录。

for dirname in os.listdir(path='.')

使用以下内容迭代子目录和文件:

for main_dir, dirs, files in os.walk(dirname):

迭代文件并继续你的逻辑。

            for f in files:
            if f.endswith("data-eval.xlsm"):
                print("Working on:", f)
                wb = openpyxl.load_workbook(f, data_only=True)
                sheet = wb["data-sheet"]
                outputFile.write("{}\n".format(i))
                for cellObj in sheet["B"]:
                    if cellObj.value == targetString:
                        print(cellObj.row, cellObj.value)
                        outputFile.write("\t{}\t{}\n".format(cellObj.row, cellObj.value))

答案 1 :(得分:0)

为了将来参考,我发现在抓取函数中实现 for glo.iglob 部分的文件而不是 os.listdir 行完美地工作并循环遍历脚本文件夹及其子文件夹的内容。