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

如何检测文件夹中连续命名文件的缺失情况

批量检测连续编号文件的缺失项

针对你处理百万级连续编号文件的需求,这里提供高效的解决方案,核心思路是提取所有文件的编号,对比连续区间找出缺失项:

高效实现方案(适用于500万级文件)

使用os.scandir替代glob,它能迭代读取目录条目,大幅降低内存占用,同时用正则精准匹配文件名格式:

import os
import re

def find_missing_files(folder_path, prefix="Name-", suffix=".txt"):
    existing_numbers = set()
    # 匹配固定前缀+10位数字+固定后缀的文件名
    file_pattern = re.compile(rf"^{re.escape(prefix)}(\d{{10}}){re.escape(suffix)}$")
    
    # 迭代遍历目录,只处理符合格式的文件
    with os.scandir(folder_path) as entries:
        for entry in entries:
            if entry.is_file():
                match_result = file_pattern.match(entry.name)
                if match_result:
                    file_number = int(match_result.group(1))
                    existing_numbers.add(file_number)
    
    if not existing_numbers:
        print("未找到符合格式的目标文件")
        return
    
    # 确定编号区间
    min_number = min(existing_numbers)
    max_number = max(existing_numbers)
    # 生成区间内所有预期编号
    expected_numbers = set(range(min_number, max_number + 1))
    # 计算缺失编号并排序
    missing_numbers = sorted(expected_numbers - existing_numbers)
    
    if missing_numbers:
        print(f"共发现 {len(missing_numbers)} 个缺失文件:")
        # 只显示前10个避免输出过载
        for num in missing_numbers[:10]:
            print(f"{prefix}{num:010d}{suffix}")
        if len(missing_numbers) > 10:
            print(f"... 剩余 {len(missing_numbers)-10} 个缺失文件未显示")
    else:
        print("所有编号连续,无缺失文件")

# 调用示例,替换为你的文件夹路径
find_missing_files("K:/path_to_files")

关键优化点

  • 内存高效:os.scandir无需一次性加载所有文件路径到内存,处理百万级文件更流畅
  • 精准过滤:正则表达式确保只处理符合Name-0000000000.txt格式的文件,排除杂文件干扰
  • 快速对比:用集合存储已存在的编号,求差集的操作时间复杂度极低

基于你现有代码的修改版(依赖创建时间)

如果你坚持用文件创建时间确定首尾编号,可修改原有代码如下(注意:创建时间可能与编号不对应,存在误差风险):

import glob
import os
import re

folder_path = 'K:/path_to_files'
# 只匹配目标格式文件
list_of_files = glob.glob(f"{folder_path}/Name-*.txt")

first_file = min(list_of_files, key=os.path.getctime)
latest_file = max(list_of_files, key=os.path.getctime)

# 提取首尾文件的编号
num_pattern = re.compile(r"Name-(\d{10})\.txt")
min_num = int(num_pattern.search(first_file).group(1))
max_num = int(num_pattern.search(latest_file).group(1))

# 收集所有已存在的编号
existing_numbers = set()
for file_path in list_of_files:
    match = num_pattern.search(file_path)
    if match:
        existing_numbers.add(int(match.group(1)))

# 找出缺失编号
expected_numbers = set(range(min_num, max_num + 1))
missing_numbers = sorted(expected_numbers - existing_numbers)

# 输出结果
if missing_numbers:
    print(f"缺失文件数量:{len(missing_numbers)}")
    print("部分缺失文件:")
    for num in missing_numbers[:10]:
        print(f"Name-{num:010d}.txt")
else:
    print("无缺失文件")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:15:40