Python将不同子文件夹缺失文件存列表后下载失败如何解决?
问题根源
- 变量混用:原有代码直接把带本地目录前缀的存储路径拼接在服务端仓库地址后,导致请求路径多出冗余前缀触发404
- 修复逻辑错误:裁剪路径前缀后,直接把无路径的文件名用于本地存储,导致文件被写入当前工作目录而非预期的子目录
- 缺少校验:未判断HTTP请求状态,404返回的错误页面会被直接写入本地文件
- 逻辑冗余:遍历目录、文件时重复初始化缺失列表,额外执行无意义的判断
- 笔误:函数定义名为
downloadTxt,最后调用的是f_auto_download_txt,会直接触发名称错误
修复后完整代码
import os import requests # 配置项统一管理 FOLDER1 = "Folder1/" FOLDER2 = "Folder1/Folder2/" FILE_REPOSITORY = "https://ourserver.tld/txtfiles/" # 请根据服务端实际存储结构调整远端路径生成规则 # 如果服务端所有txt都直接放在txtfiles根目录、无层级,保持下面的USE_BASENAME为True # 如果服务端txt存储层级和本地完全一致,设为False USE_BASENAME_FOR_REMOTE = True def download_txt(): # 第一步:创建所有必要目录 folder_list = [FOLDER1, FOLDER2] for folder in folder_list: # exist_ok=True已经内置了存在判断,无需手动校验 os.makedirs(folder, exist_ok=True) # 第二步:收集所有缺失的本地文件 file_list = [ FOLDER1 + "example1.txt", FOLDER2 + "example2.txt", FOLDER2 + "example3.txt", FOLDER2 + "example4.txt", ] missing_files = [f for f in file_list if not os.path.exists(f)] if not missing_files: print("所有依赖文件已存在,无需下载") return # 第三步:逐个下载缺失文件 for local_path in missing_files: # 生成远端请求路径 if USE_BASENAME_FOR_REMOTE: # 服务端无层级,只取文件名 remote_file = os.path.basename(local_path) else: # 服务端层级和本地一致,直接用本地路径 remote_file = local_path # 自动处理路径首尾斜杠,避免拼接出错 download_url = f"{FILE_REPOSITORY.rstrip('/')}/{remote_file.lstrip('/')}" try: # 发起请求,校验返回状态 resp = requests.get(download_url, timeout=10) resp.raise_for_status() # 写入本地文件,用上下文管理器避免资源泄漏 with open(local_path, "wb") as f: f.write(resp.content) print(f"下载成功:{local_path}") except Exception as e: print(f"下载失败 {local_path},错误信息:{str(e)}") if __name__ == "__main__": download_txt()
逻辑说明
- 目录创建直接使用
os.makedirs的exist_ok=True参数,无需手动判断目录是否存在,简化代码 - 明确拆分「本地存储路径」和「远端请求路径」两个变量,互不干扰
- 增加请求超时、状态校验、异常捕获逻辑,避免错误内容写入本地文件
- 配置项统一管理,可根据服务端实际存储结构快速调整远端路径生成规则,无需修改核心逻辑
- 修正了原代码的函数调用笔误,避免名称错误
内容的提问来源于stack exchange,提问作者NinjaSnickers
相关产品推荐
相关产品推荐

