Рекурсивная очистка данных в таблицах Excel в структуре вложенных папок - PullRequest
0 голосов
/ 11 июня 2018

Помоги мне, пожалуйста.Я хотел бы просмотреть структуру каталогов, которая выглядит следующим образом:

Topdir> subdir 1> excel 1/2/3

Topdir> subdir 2> excel 4

etc

Я очищаю столбец B Excel для строки, и это хорошо работает.Тем не менее, мой сценарий проходит только через topdir и не входит в subdir.Ниже мой код:

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 голосов
/ 11 июня 2018

Для дальнейшего использования я выяснил, что реализация для имени файла в glo.iglob в функции очистки вместо строки os.listdir отлично работает и проходит по содержимомупапка скрипта и его подпапки.

0 голосов
/ 11 июня 2018

Вы можете попробовать вот так:

    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))
...