请帮帮我。我想遍历一个看起来像这样的目录结构:
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='.')
但是,我不知道使循环的变量递增的解决方案。
答案 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 行完美地工作并循环遍历脚本文件夹及其子文件夹的内容。