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

10000个文件分7块后数量异常问题排查及修复

问题分析与修复:10000个文件分7块时最后一块数量异常

问题描述

我拥有10000个文件,计划将其划分为7个分块,并在对应目录创建符号链接。由于10000无法被7整除(10000=7×1428+4),理论上最后一个分块应多4个文件,但实际最后一块与其他分块文件数量一致。

原代码

import os

StartDir = "OriginalDir"
FirstEndDir   = "FirstSeventh"
SecondEndDir  = "SecondSeventh"
ThirdEndDir   = "ThirdSeventh"
FourthEndDir  = "FourthSeventh"
FifthEndDir   = "FifthSeventh"
SixthEndDir   = "SixthSeventh"
SeventhEndDir = "SeventhSeventh"

AllFileList = os.listdir(StartDir)

SortedList = sorted(AllFileList, key=lambda x: int(x.split("_")[-1].split(".")[0]))
print SortedList[0]

n = len(SortedList)/7

FirstList = [SortedList[i:i + n] for i in xrange(0, n, 1)]
SecondList = [SortedList[i:i + n] for i in xrange(n, 2*n, 1)]
ThirdList = [SortedList[i:i + n] for i in xrange(2*n, 3*n, 1)]
FourthList = [SortedList[i:i + n] for i in xrange(3*n, 4*n, 1)]
FifthList = [SortedList[i:i + n] for i in xrange(4*n, 5*n, 1)]
SixthList = [SortedList[i:i + n] for i in xrange(5*n, 6*n, 1)]
SeventhList = [SortedList[i:i + n] for i in xrange(6*n, len(SortedList), 1)]

for ii in FirstList[0]:
    print ii
    os.symlink(os.path.join(StartDir,ii),os.path.join(FirstEndDir,ii))

for ii in SecondList[0]:
    print ii
    os.symlink(os.path.join(StartDir,ii),os.path.join(SecondEndDir,ii))

for ii in ThirdList[0]:
    print ii
    os.symlink(os.path.join(StartDir,ii),os.path.join(ThirdEndDir,ii))

for ii in FourthList[0]:
    print ii
    os.symlink(os.path.join(StartDir,ii),os.path.join(FourthEndDir,ii))

for ii in FifthList[0]:
    print ii
    os.symlink(os.path.join(StartDir,ii),os.path.join(FifthEndDir,ii))

for ii in SixthList[0]:
    print ii
    os.symlink(os.path.join(StartDir,ii),os.path.join(SixthEndDir,ii))

for ii in SeventhList[0]:
    print ii
    os.symlink(os.path.join(StartDir,ii),os.path.join(SeventhEndDir,ii))

问题原因

  1. 分块逻辑冗余且易混淆:
    前6个分块使用xrange(0, n, 1)类循环生成列表推导式,实际会创建多个重复的子列表,但代码只取每个列表的[0]元素,写法完全多余,且容易误导后续逻辑。
  2. 最后一块未处理剩余文件:
    第七个分块用步长1的循环生成切片,会生成多个子列表,但代码只取了SeventhList[0],也就是6n到7n的1428个文件,完全忽略了7n到10000之间的4个剩余文件,导致最后一块数量与前面一致。

修复方案

  1. 简化分块逻辑:直接用列表切片获取每个分块,去掉冗余的列表推导式。
  2. 正确处理剩余文件:计算基础分块大小和余数,让最后一个分块包含所有剩余文件。

修复后的代码

import os

StartDir = "OriginalDir"
end_dirs = [
    "FirstSeventh",
    "SecondSeventh",
    "ThirdSeventh",
    "FourthSeventh",
    "FifthSeventh",
    "SixthSeventh",
    "SeventhSeventh"
]

AllFileList = os.listdir(StartDir)
SortedList = sorted(AllFileList, key=lambda x: int(x.split("_")[-1].split(".")[0]))

total_files = len(SortedList)
base_size = total_files // 7

# 划分分块:前6个分块取base_size,最后一个分块取剩余所有文件
chunks = []
start_idx = 0
for _ in range(6):
    chunks.append(SortedList[start_idx:start_idx + base_size])
    start_idx += base_size
chunks.append(SortedList[start_idx:])

# 创建符号链接
for chunk, end_dir in zip(chunks, end_dirs):
    # 确保目标目录存在
    if not os.path.exists(end_dir):
        os.makedirs(end_dir)
    for filename in chunk:
        src_path = os.path.join(StartDir, filename)
        dst_path = os.path.join(end_dir, filename)
        # 避免重复创建链接
        if not os.path.exists(dst_path):
            os.symlink(src_path, dst_path)

说明

  • 用列表存储目标目录,通过循环简化重复的链接创建逻辑,更易维护。
  • 增加目标目录创建判断,避免因目录不存在报错。
  • 最后一个分块直接取start_idx到末尾的所有元素,确保包含剩余4个文件,总数量为1432,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:35:01