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
相关产品推荐
相关产品推荐

