使用Python requests上传Strava GPX文件触发ValueError是什么原因?
错误诱发原因
这个ValueError完全是requests库的files参数格式传错导致的,具体问题如下:
requests要求files参数要么是键值对结构的字典,要么是由二元组组成的列表,内部会遍历每个键值对提取表单字段名和对应内容。你传入的是由3个独立单键字典组成的列表,遍历时拿到的是单个字典对象,无法拆分为(k, v)两个值,直接触发了报错。- 你把普通表单参数
data_type、请求头属性Content-Type都错误放到了files参数里,这两个参数本来就不属于文件上传字段的范畴。 - 手动设置
multipart/form-data类型的Content-Type没有必要,requests传递files参数时会自动生成带边界标识的正确请求头,手动填写反而可能因为缺少边界参数导致请求失败。
解决方法
按照requests的要求调整参数结构即可,修正后的代码如下:
import requests headers = {'authorization': 'Bearer XXXXXXXXXXXXXXXX'} # 普通表单参数放到data参数中传递 data = {'data_type': 'gpx'} # files仅存放文件相关字段,使用字典结构 files = {'file': open('../poc_data/Sport-sessions/GPS-data/2012-08-09_05-32-43-UTC_55d566fa93bc7d9d1757b8e0.gpx', 'rb')} r = requests.post('https://www.strava.com/api/v3/uploads', headers=headers, data=data, files=files) # 文件使用完毕后记得关闭,避免资源泄漏 files['file'].close()
如果要更安全的文件操作,推荐使用上下文管理器写法:
import requests headers = {'authorization': 'Bearer XXXXXXXXXXXXXXXX'} data = {'data_type': 'gpx'} file_path = '../poc_data/Sport-sessions/GPS-data/2012-08-09_05-32-43-UTC_55d566fa93bc7d9d1757b8e0.gpx' with open(file_path, 'rb') as f: files = {'file': f} r = requests.post('https://www.strava.com/api/v3/uploads', headers=headers, data=data, files=files)
内容的提问来源于stack exchange,提问作者squeezer44
相关产品推荐
相关产品推荐

