Python os.listdir()遍历目录移动文件时跳过文件问题咨询
故障原因
文件被跳过是两个逻辑错误共同导致的:
- 循环内重复读取动态目录列表造成索引错位:你每次循环都调用
os.listdir("oldfiles")获取当前目录的文件列表,这个列表会随着文件移动操作实时更新。第一次循环移走索引0对应的atext0.txt后,原目录剩余文件为atext1.txt、atext2.txt,此时os.listdir返回的列表长度变为2;第二次循环取索引1的元素时,直接从新列表里拿到了atext2.txt,中间的atext1.txt直接被跳过。 - 循环范围设置错误:
range(len(files) - 1)人为减少了一次循环,是之前为了规避索引越界加的错误补丁,本身就会漏掉一个待处理文件。
修复方案
- 不要在循环中重复调用
os.listdir读取动态变化的目录内容,直接使用循环开始前通过glob.glob获取的固定文件列表做遍历 - 移除
range参数里的-1,保证所有初始扫描到的文件都能被处理 - 用标准库的路径处理方法拼接路径、提取文件名,规避不同操作系统的路径分隔符兼容问题
修复后可正常运行的代码:
import glob import os import shutil # 循环开始前一次性拿到所有待处理文件的固定路径列表 files = glob.glob("oldfiles/*") print("Length ==", len(files)) print(files) # 用enumerate同时拿到遍历序号和文件路径,不需要手动维护索引 for file_idx, old_file_path in enumerate(files): new_file_name = f"ztext{file_idx}.txt" # 从已拿到的固定路径中提取原文件名,无需重复读取目录 old_file_name = os.path.basename(old_file_path) print(file_idx) print(old_file_name) # 用os.path.join拼接路径,兼容Windows/macOS/Linux shutil.move(old_file_path, os.path.join("newfiles", new_file_name))
上述代码运行后,初始目录下的3个文件会被依次移动并重命名为ztext0.txt、ztext1.txt、ztext2.txt,不会出现文件遗漏。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

