如何使用Python遍历子文件夹并移动指定http.log文件到目标文件夹
遍历目录移动指定http.log文件的代码修正
原代码存在的核心错误
- 路径变量未使用字符串引号包裹,会触发未定义变量报错
- 缩进完全缺失,Python对缩进有强语法要求,
if/else分支必须在循环内缩进 os.walk返回的files是当前路径下的文件名列表,无法直接和字符串'http.log'做相等判断- 不存在
os.move方法,且原代码中移动操作的语法完全错误,未指定源文件路径、目标文件路径参数 - 不存在
skip关键字,Python分支中不需要额外声明跳过逻辑,不满足判断条件会自动进入下一轮循环 - 未提前处理目标文件夹不存在的场景,直接移动文件会触发路径不存在报错
修正后可直接运行的代码
import os import shutil # 定义源文件夹、目标文件夹路径,字符串需加引号 target_folder = "new_folder_with_http" source_folder = "original_data" # 自动创建目标文件夹,文件夹已存在时不触发报错 os.makedirs(target_folder, exist_ok=True) # 递归遍历源文件夹下所有内容 for root, _, files in os.walk(source_folder): # 遍历当前路径下的所有文件 for file_name in files: if file_name == "http.log": # 拼接源文件的完整绝对路径 source_full_path = os.path.join(root, file_name) # 拼接目标位置的完整路径 target_full_path = os.path.join(target_folder, file_name) # 执行移动操作,shutil.move兼容跨磁盘分区移动场景 shutil.move(source_full_path, target_full_path) print(f"移动完成: {source_full_path} -> {target_full_path}")
注意事项
- 如果不同子文件夹下存在多个同名
http.log,上述代码会出现后移动的文件覆盖先移动文件的问题。如果需要保留所有文件,可以在目标文件名中拼接源文件的相对路径做区分,例如将文件名替换为f"{root.replace(os.sep, '_')}_{file_name}"避免重名 - 不建议使用
os.rename做文件移动,该方法在跨磁盘分区场景下会直接报错,shutil.move会自动处理跨分区复制+删除源文件的逻辑,兼容性更好
内容的提问来源于stack exchange,提问作者uka
相关产品推荐
相关产品推荐

