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

Python中动态计算数值范围实现文件按规则归档

文件按数值区间归类的数学逻辑问题

需求说明

  • 现有一批命名格式为x.tif(x为整数)的文件,需按数值范围归类到两级文件夹:
    • 顶层为百万级区间,例如0-999999、1000000-1999999
    • 下一层为千级区间,例如0-999、1000-1999

核心难点

核心问题是实现区间计算的数学逻辑,希望避免硬编码大量分支。此前尝试用divmod()函数仅适配了千以内数值,未实现任意数值的动态计算,以下是尝试的代码及预期输出:

原尝试代码

def get_number_range(file_to_move): 

    file_number = file_to_move
    try:
        mod_calc_thou = divmod(int(file_number), 1000)
    except ValueError:
        self.mission_failed(file_to_move, reason="Not a number")
        return False, False
    try: 
        mod_calc_mil = divmod(int(file_number), 1000000)
    except ValueError:
        return False, False
    thousands_range = mod_calc_thou[0] + 999
    millions_range = mod_calc_mil[0] + 9999999
    thousands_range_folder = f"{str(mod_calc_thou[0])}-{thousands_range}"
    millionsths_range_folder = f"{str(mod_calc_mil[0])}-{millions_range}"
    print(thousands_range_folder)
    print(millionsths_range_folder)

print("First")
get_number_range("530")
# 预期输出:0-999 和 0-999999
print("Second")
get_number_range("1842888")
# 预期输出:1842000-1842999、1000000-1999999
print("Third")
get_number_range("19874")
# 预期输出:19000-19999、0-999999

问题分析与修正

原代码的区间计算逻辑存在错误:

  • 千级区间起始值应为商 × 1000,结束值为商 × 1000 + 999,而非直接用商加999
  • 百万级区间起始值应为商 × 1000000,结束值为商 × 1000000 + 999999,而非商加9999999

修正后的代码及逻辑说明:

def get_number_range(file_to_move):
    try:
        num = int(file_to_move)
    except ValueError:
        # self.mission_failed(file_to_move, reason="Not a number")
        print(f"错误:{file_to_move} 不是有效整数")
        return False, False

    # 计算千级区间:商×1000 到 商×1000+999
    thou_q, _ = divmod(num, 1000)
    thou_start = thou_q * 1000
    thou_end = thou_start + 999
    thou_folder = f"{thou_start}-{thou_end}"

    # 计算百万级区间:商×1000000 到 商×1000000+999999
    mil_q, _ = divmod(num, 1000000)
    mil_start = mil_q * 1000000
    mil_end = mil_start + 999999
    mil_folder = f"{mil_start}-{mil_end}"

    print(thou_folder)
    print(mil_folder)
    return thou_folder, mil_folder

print("First")
get_number_range("530")
# 输出:0-999
#      0-999999
print("Second")
get_number_range("1842888")
# 输出:1842000-1842999
#      1000000-1999999
print("Third")
get_number_range("19874")
# 输出:19000-19999
#      0-999999

逻辑说明

  • 用divmod(num, interval)获取商和余数,商代表当前数值落在第几个区间段
  • 区间起始值 = 商 × 区间跨度(千级跨度1000,百万级跨度1000000)
  • 区间结束值 = 起始值 + 跨度 - 1(比如1000跨度的结束值就是起始值+999)
  • 该逻辑可扩展到任意跨度的区间计算,无需硬编码分支

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:25:03