如何使用Python读取AWS Lambda包中指定文件夹下的所有文件?
解决AWS Lambda中读取包内文件夹文件的问题
我来帮你搞定这个问题,先拆解下你遇到的错误原因,再给你几个靠谱的解决方案:
为什么你的代码会报错?
attribute 'files' does not exist错误:importlib.resources.files是Python 3.9才新增的API,如果你的AWS Lambda运行时用的是Python 3.8或更低版本,自然会找不到这个属性。__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
相关产品推荐
相关产品推荐

