Python使用shutil.move移动匹配文件时仅移动单个文件的问题如何修复?
问题根因
- 移动逻辑缩进错误:你把
shutil.move()语句放在了if not os.path.isdir(thirdfolder)的判断分支内部,只有首次创建目标文件夹的时候才会触发文件移动。当第一个匹配到指定子串的文件完成文件夹创建后,后续遍历到的其他匹配文件,会因为文件夹已存在无法进入该分支,自然不会执行移动操作。你观察到每次只移动一个文件,是因为os.listdir()的遍历顺序受系统规则影响,每次运行会取遍历顺序里第一个匹配到的文件移动,剩余文件留在原目录。 - 每次运行清空历史文件:代码开头直接执行
shutil.rmtree('Animals'),会把整个Animals目录及内部所有文件删除,上次运行移动进去的文件都会被清空。
修复方案
首先调整移动语句的缩进,将shutil.move()放到文件夹判断的外面。如果不需要每次运行都清空已归类的文件,直接删除开头的shutil.rmtree('Animals')语句即可。
此外你可以用字典映射动物名称和对应编号,消除重复代码,优化后代码如下:
import os import shutil def move(): # 动物和对应编号的映射,后续新增规则直接在这里加即可 animal_map = { '1837': 'Buffalo', '6104': 'donkey', '9731': 'Chimpanzee', '2905': 'cat', '6648': 'rat', '3128': 'sheep', '3053': 'lizard', '2681': 'insect', '3901': 'dog' } # 如果不需要每次清空已归类的文件,注释/删除下面这行 # shutil.rmtree('Animals') firstfolder = 'Animals' if not os.path.isdir(firstfolder): os.mkdir(firstfolder) for file in os.listdir(): # 跳过目录,只处理文件 if not os.path.isfile(file): continue for code, animal_name in animal_map.items(): if code in file: secondfolder = os.path.join(firstfolder, animal_name) thirdfolder = os.path.join(secondfolder, 'testfolder') if not os.path.isdir(secondfolder): os.mkdir(secondfolder) if not os.path.isdir(thirdfolder): os.mkdir(thirdfolder) # 移动语句放到判断外面,不管文件夹是否刚创建都执行移动 shutil.move(file, thirdfolder) # 一个文件只匹配一个规则,匹配到就跳出循环不用继续判断 break if __name__ == '__main__': move()
注意事项
- 新增的跳过目录逻辑避免把
Animals本身当成文件处理,防止报错 - 用
os.path.join拼接路径适配不同操作系统,避免Windows/Linux路径分隔符不兼容的问题 - 匹配到对应规则后加break,避免一个文件匹配多个规则导致移动异常
内容的提问来源于stack exchange,提问作者Hacker--Rohan Raj
相关产品推荐
相关产品推荐

