【问题标题】:Why do I get a ''FileNotFoundError'' in python?为什么我在 python 中得到 \'\'FileNotFoundError\'\'?
【发布时间】:2023-01-23 01:13:25
【问题描述】:

我的目录和子目录中有一个 xlsx 文件列表,我想在某些条件下循环遍历此列表。现在看来该代码适用于主目录,但在打开子目录中的文件时遇到问题。我使用了 os.walk 方法,但我仍然收到错误消息“[Errno 2] 没有这样的文件或目录:”文档名称''' 。错误发生在代码的最后一段,即以 'for f in files: if f.endswith('.xlsx'): 开头的部分,依此类推。

如何解决这个问题?

path = os.getcwd()
files = os.listdir(path)

directories = ['2018', '2017', '2016', '2015']

for directory in directories:
   directory_path = os.path.join(path, directory)
   files_in_directory = os.listdir(directory_path)
   for file in files_in_directory:
       files.append(file)


 filtered_files_list = []

 for f in files:
    if f.endswith('.xlsx'):      
       wb = openpyxl.load_workbook(f)
       if "2014" in wb.sheetnames:
           filtered_files_list.append(f)

 for root, dirs, files in os.walk(path):
   if root.endswith("2018") or root.endswith("2017") or root.endswith("2016") or root.endswith("2015"):
        for f in files:
           if f.endswith('.xlsx'):               
               wb = openpyxl.load_workbook(os.path.join(root, f))
               if "2014" in wb.sheetnames:
                   filtered_files_list.append(f)

print(filtered_files_list)

【问题讨论】:

  • 我建议您打印您要打开的文件的完整路径。那会告诉你你做错了什么

标签: python list loops directory os.walk


【解决方案1】:

您的 listdir + walk 组合听起来可以用 pathlib.Path.glob 进行简化,这也将为您提供完整路径,而无需 join

from pathlib import Path
from openpyxl import load_workbook

filtered_files_list = []

filter_directories = {"2015", "2016", "2017", "2018"}  # set for fast search

p = Path(".")  # equivalent to getcwd
for xlsx in p.glob("./**/*.xlsx"):  # recursive search for all XLSX under CWD
    if xlsx.parents[0] not in filter_directories:  # skip if not in filter_directories
        continue
    wb = openpyxl.load_workbook(xlsx)
    if "2014" in wb.sheetnames:
        filtered_files_list.append(f)

【讨论】: