Python requests遍历本地文件夹批量上传多文件问题咨询
问题根因
os.listdir(path) 仅返回目标目录下的文件/子文件夹名称,不会携带传入的根路径前缀。直接用返回的文件名调用open()时,程序会默认从脚本当前运行目录查找文件,自然无法定位到指定上传文件夹内的内容。
另外你当前的字典推导式给所有文件设置了相同的key 'file',遍历过程中后面的文件会覆盖前面的条目,最终实际只会保留最后一个文件,无法实现多文件上传。
实现方案
基础版:遍历指定目录下的一级文件
通过os.path.join()拼接根目录和文件名,得到文件的完整绝对路径,同时给每个上传文件设置唯一key,跳过目录下的子文件夹避免打开报错:
import os upload_path = "/Users/mycode/Documents/API_upload/" upload_files = {} for idx, file_name in enumerate(os.listdir(upload_path)): # 拼接完整文件路径 full_file_path = os.path.join(upload_path, file_name) # 仅处理文件,跳过子目录 if os.path.isfile(full_file_path): upload_files[f"upload_file_{idx}"] = open(full_file_path, "rb")
进阶版:递归遍历目录下所有子文件夹的文件
如果需要把指定目录下所有子文件夹里的文件也一并上传,可以用os.walk()实现递归遍历:
import os upload_path = "/Users/mycode/Documents/API_upload/" upload_files = {} file_idx = 0 for root, _, file_names in os.walk(upload_path): for file_name in file_names: full_file_path = os.path.join(root, file_name) upload_files[f"upload_file_{file_idx}"] = open(full_file_path, "rb") file_idx += 1
注意事项
- 打开的文件句柄会占用系统资源,请求发送完成后一定要手动关闭,推荐用
try/finally块统一管理资源,避免泄漏:
import os import requests upload_path = "/Users/mycode/Documents/API_upload/" api_url = "替换为你的上传接口地址" file_handles = [] try: # 构造上传文件列表 for idx, file_name in enumerate(os.listdir(upload_path)): full_path = os.path.join(upload_path, file_name) if os.path.isfile(full_path): file_handles.append(open(full_path, "rb")) # 按requests要求构造上传格式 upload_payload = [(f"file_{i}", f) for i, f in enumerate(file_handles)] # 发送POST请求 response = requests.post(api_url, files=upload_payload) print(f"上传结果:状态码{response.status_code},返回内容{response.text}") finally: # 所有逻辑执行完后统一关闭文件 for f in file_handles: f.close()
- 如果你的上传接口要求固定的文件参数字段名,可以把key调整为接口要求的名称,注意不要出现重名即可。
内容的提问来源于stack exchange,提问作者Mycode
相关产品推荐
相关产品推荐

