Python requests批量存储PDF时所有输出均为最后一个响应如何解决
异常产生原因
- 核心问题出在双层循环的交叉写入逻辑上。原代码的循环结构为外层遍历所有HTTP响应对象,内层遍历全部KVK文件名,实际执行流程为:
- 取到第1个响应时,把该响应的内容依次写入
88888888.pdf、9999999.pdf、4444444.pdf三个文件 - 取到第2个响应时,重复将响应内容覆盖写入上述三个PDF文件
- 取到第3个(最后一个)响应时,第三次执行覆盖写入操作
最终所有PDF文件都会被最后一轮的写入操作覆盖,内容完全等同于最后一个响应的返回结果,完全无法实现响应和文件名的一一匹配。
- 取到第1个响应时,把该响应的内容依次写入
- 该逻辑没有建立响应内容和目标文件名的对应映射,反而做了全量交叉遍历,必然出现内容全被覆盖的问题。
解决方案
- 最直接的修正方式是移除多余的内层嵌套循环,通过列表下标逐对匹配响应对象和对应文件名,确保单次写入只对应一个响应、一个目标文件:
# 提前确认两个列表长度、顺序和业务映射完全一致 for idx in range(len(listfiles)): resp = listfiles[idx] kvk_name = kvk_list[idx] with open(f"{kvk_name}.pdf", "wb") as f: f.write(resp.content) - 更简洁的写法是使用
zip()函数直接将两个等长序列配对迭代,代码可读性更强,也能避免手动写下标可能出现的越界错误:for resp, kvk_name in zip(listfiles, kvk_list): with open(f"{kvk_name}.pdf", "wb") as f: f.write(resp.content) - 注意事项:执行写入前需要确认两个列表的长度完全相等,且顺序和业务映射完全匹配(例如请求列表中第一个请求对应的业务KVK值,就是
kvk_list的第一个元素),避免顺序错配导致文件名和内容不对应的问题。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

