You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python读取AWS Lambda包中指定文件夹下的所有文件?

解决AWS Lambda中读取包内文件夹文件的问题

我来帮你搞定这个问题,先拆解下你遇到的错误原因,再给你几个靠谱的解决方案:

为什么你的代码会报错?

  1. attribute 'files' does not exist错误:importlib.resources.files是Python 3.9才新增的API,如果你的AWS Lambda运行时用的是Python 3.8或更低版本,自然会找不到这个属性。
  2. __enter__错误:importlib.resources.contents返回的是一个迭代器,不是上下文管理器,不能用with语句包裹,直接调用遍历就行。

方案一:用os模块结合Lambda任务目录(兼容性最强)

AWS Lambda会把你的代码包解压到/var/task目录下,而且运行时的工作目录默认就是这个路径。你可以直接用os模块来读取,本地和Lambda环境都能兼容:

import os

# 获取Lambda任务根目录,本地环境会 fallback 到当前目录
task_root = os.environ.get("LAMBDA_TASK_ROOT", ".")
# 拼接目标文件夹的完整路径
folder_path = os.path.join(task_root, "folder_name")
# 列出文件夹下的所有文件
l_files = os.listdir(folder_path)

这个方法不需要考虑Python版本,也不需要把文件夹改成Python包,省心又好用。

方案二:正确使用importlib.resources(适合Python 3.9+)

如果你的Lambda运行时是Python 3.9或更高版本,想使用importlib.resources的话,得注意正确用法:

方式1:用contents遍历资源

import importlib.resources

# 注意:folder_name必须是带有__init__.py的Python包
resource_contents = importlib.resources.contents("folder_name")
# 过滤出真正的文件(排除子目录、__init__.py等,按需调整)
l_files = [item for item in resource_contents if importlib.resources.is_resource("folder_name", item)]

方式2:用files方法获取文件夹对象

from importlib.resources import files

# 获取目标文件夹的对象
folder = files("folder_name")
# 遍历文件夹下的文件,提取文件名
l_files = [entry.name for entry in folder.iterdir() if entry.is_file()]

这里同样要求folder_name是一个合法的Python包(即文件夹内有__init__.py文件)。

总结

推荐优先用方案一,兼容性更好,代码也更简单。如果一定要用importlib.resources,记得检查Lambda的Python版本,并且确保目标文件夹是一个Python包。

内容的提问来源于stack exchange,提问作者nikhilthms94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:24:06