我有一系列名为“x.tif”的文件,其中“x”是一个整数 我需要将这些文件分类到每个数字范围的文件夹中。
文件夹的顶层应以百万为单位,例如0-999999、1000000-1999999 下一级文件夹应该以千为单位,例如0-999、1000-1999
让我困惑的并不是Python,而是计算范围的实际数学
当然,我可以使用硬编码范围来做到这一点,但我宁愿避免为每一百万中的每一千输入一个巨大的 elif 语句。
我一直在尝试使用 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")
#Should output 0-999 and 0-999999
print("Second")
get_number_range("1842888")
#Should output, 1842000-1842999, 1000000-1999999
print("Third")
get_number_range("19874")
#Should output 19000-19999, 0-999999
您可以使用 modulo
%
运算来计算文件编号的提醒,并减去该提醒以获得范围的基数 fi
。范围的顶部数字是 fi
+ Li
- 1。
n = 19874
L1 = 1000000 # Top-level
L2 = 1000 # Next-level
# Compute the base of the ranges
f1 = n - (n % L1)
f2 = n - (n % L2)
# Compute the whole range
r1 = f1, f1 + L1 - 1
r2 = f2, f2 + L2 - 1
print(r2, r1)
这可以很容易地适应两个以上的级别。
n = 1842888
# The levels in increasing order
levels = [1000, 1000000]
# Compute the base of the ranges
f = [n - (n % l) for l in levels]
# Compute the whole range
r = [(f, f + l - 1) for (f, l) in zip(f, levels)]
print(r)
您可以将其变成一个通用的递归函数,该函数将支持任意数量的级别和分块大小。从完整范围开始,将其分解为块,然后使用与包含文件号的块相对应的缩小范围进行递归:
def getFolders(FN,spread=1000,levels=2,base=0, maxN=0):
maxN = maxN or spread**(levels+1)
chunk = (maxN-base) // spread
if chunk < spread: return []
base += (FN-base) // chunk * chunk
return getFolders(FN,spread,levels,base,base+chunk) + [f"{base}-{base+chunk-1}"]
输出:
print(getFolders(530)) # ['0-999', '0-999999']
print(getFolders(184288)) # ['184000-184999', '0-999999']
print(getFolders(19874)) # ['19000-19999', '0-999999']
print(getFolders(530,spread=100,levels=3))
# ['500-599', '0-9999', '0-999999']
print(getFolders(184288,spread=100,levels=3))
# ['184200-184299', '180000-189999', '0-999999']
print(getFolders(19874,spread=100,levels=3))
# ['19800-19899', '10000-19999', '0-999999']