如何根据文本文件中存储的名称从指定文件夹复制对应图片
问题原因
- 文件指针耗尽问题:
f.readlines()被放在遍历图片的内层循环中,第一次读取完txt所有内容后,文件指针会移动到文件末尾,后续遍历其他图片时再次调用f.readlines()只能得到空列表,不会进入匹配逻辑。 - 字符串匹配未处理特殊字符:从txt读取的每一行
line默认携带末尾的换行符\n,还有可能存在首尾空格、空行,直接和无特殊字符的j做相等判断永远会失败。 - 复制路径缺少文件后缀:txt中存储的是不带后缀的文件名,调用
shutil.copy时直接用line.strip()拼接路径,拼接出的路径没有.jpg后缀,指向的文件不存在,即使匹配上也无法完成复制。
修复后的代码
import os import shutil dst = "t" path = 'train' # 提前读取txt所有内容,存为去重、去首尾空白的集合,过滤空行,提升匹配效率 with open("file_txt.txt", 'r') as f: target_names = {line.strip() for line in f if line.strip()} files = os.listdir(path) for i in files : if i.endswith('.jpg'): j = i.rsplit('.', 1)[0] if j in target_names: # 用os.path.join拼接路径,兼容不同操作系统的路径分隔符,直接用原文件名避免后缀错误 shutil.copy(os.path.join(path, i), dst)
额外优化说明
- 用
with语句管理文件句柄,自动关闭文件,避免资源泄漏 - 目标名存为集合后,匹配时间复杂度从O(n)降到O(1),文件数量多的时候效率提升非常明显
内容的提问来源于stack exchange,提问作者Lei
相关产品推荐
相关产品推荐

