You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于文件列表从目录A复制文件到目录B的Python代码问题排查

问题:按文件列表从目录A复制文件到目录B时,if分支始终未执行

我想基于目录B中存放的待提取文件列表txt,将目录A中的对应文件复制到目录B。参考相关代码后,发现代码中的if分支始终未触发(已在分支内添加in here打印语句)。

我的代码

import os
import shutil

def read_input_file():
    my_file = open("/mnt/d/Downloads/TSU/remaining_files_noUSD_19Jan.txt", "r")
    # reading the file
    data = my_file.read()
    data_into_list = data.split("\n")
    #print(data_into_list)
    my_file.close()
    return data_into_list


def filter_data(list_of_files):
    path="/mnt/e/Toyota Smarthome/Untrimmed/Videos_mp4"
    path_to_be_moved="/mnt/d/Downloads/TSU"
    #print(list_of_files)
    for file in os.listdir(path):
        #print(file)
        if file in list_of_files:
            print("in here")
            print(file)
            shutil.copytree(path,path_to_be_moved)
            #os.system("mv "+path+file+" "+path_to_be_moved)
            
if __name__ == "__main__":
    list = read_input_file()
    filter_data(list)

环境与输入情况

  • 使用WSL环境下的Python3
  • mp4文件夹中包含多个视频文件
  • 读取输入文件的输出如下:
    读取输入文件的输出

问题分析与修正方案

核心问题点

  1. 文件列表的空白/换行符残留:原代码用split("\n")拆分文件内容,会把文件末尾的空行、Windows格式的\r字符保留在列表中,导致文件名匹配失败。
  2. 文件复制方法误用:shutil.copytree是复制整个目录的方法,不是复制单个文件,会导致逻辑错误。
  3. 路径拼接错误:原代码中直接用path+file拼接路径,会出现类似/mnt/e/...Videos_mp4file.mp4的无效路径。

修正后的代码

import os
import shutil

def read_input_file():
    file_path = "/mnt/d/Downloads/TSU/remaining_files_noUSD_19Jan.txt"
    with open(file_path, "r") as my_file:
        # 处理每行:去除空白字符、过滤空行,避免无效匹配
        data_into_list = [line.strip() for line in my_file if line.strip()]
    return data_into_list


def filter_data(list_of_files):
    source_path = "/mnt/e/Toyota Smarthome/Untrimmed/Videos_mp4"
    target_path = "/mnt/d/Downloads/TSU"
    # 确保目标目录存在,避免复制时报错
    os.makedirs(target_path, exist_ok=True)
    
    for file in os.listdir(source_path):
        if file in list_of_files:
            print("in here")
            print(file)
            # 拼接完整文件路径
            source_file = os.path.join(source_path, file)
            target_file = os.path.join(target_path, file)
            # 复制单个文件(保留元数据)
            shutil.copy2(source_file, target_file)
            
if __name__ == "__main__":
    file_list = read_input_file()
    filter_data(file_list)

关键修正说明

  • 用with语句管理文件,自动关闭文件,避免资源泄漏
  • 读取文件时用列表推导式处理每行,去除\r、空格等空白字符,过滤空行,确保列表中只有有效文件名
  • 替换shutil.copytree为shutil.copy2,正确复制单个文件并保留文件元数据
  • 使用os.path.join拼接路径,避免手动拼接的路径错误
  • 添加os.makedirs(target_path, exist_ok=True),确保目标目录存在,防止复制时因目录不存在报错

内容的提问来源于stack exchange,提问作者Megan Darcy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:30:50