基于文件列表从目录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文件夹中包含多个视频文件
- 读取输入文件的输出如下:

问题分析与修正方案
核心问题点
- 文件列表的空白/换行符残留:原代码用
split("\n")拆分文件内容,会把文件末尾的空行、Windows格式的\r字符保留在列表中,导致文件名匹配失败。 - 文件复制方法误用:
shutil.copytree是复制整个目录的方法,不是复制单个文件,会导致逻辑错误。 - 路径拼接错误:原代码中直接用
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
相关产品推荐
相关产品推荐

