我有不同的非常大的文件集,我想将它们放在不同的子文件夹中。我已经为每个要使用的文件夹设置了一个连续的ID。
我想从右侧分割ID,以便在更深层次上始终有1000个文件夹。
示例:
id:100243
=> 结果路径:'./100/243'
id:1234567890
=> 结果路径:'1/234/567/890'
我找到了Split string every nth character?,但是所有解决方案都是从左到右的,而且我也不想为一行代码导入另一个模块。
我的当前(可工作)解决方案如下:
import os
base_path = '/home/made'
n=3 # take every 'n'th from the right
max_id = 12345678900
test_id = 24102442
# current algorithm
str_id = str(test_id).zfill(len(str(max_id)))
ext_path = list(reversed([str_id[max(i-n,0):i] for i in range(len(str_id),0,-n)]))
print(os.path.join(base_path, *ext_path))
输出结果为:
/home/made/00/024/102/442
对于我想要做的简单事情,目前算法看起来笨拙而复杂。我想知道是否有更好的解决方案。如果没有,它可能会帮助其他人。更新:
我真的很喜欢Joe Iddons的解决方案。使用.join和mod使它更快,更易读。
最终,我决定永远不想在前面加上“/”。为了摆脱前导的
/
(在len(s)%3
为零的情况下),我改变了这一行。'/'.join([s[max(0,i):i+3] for i in range(len(s)%3-3*(len(s)%3 != 0), len(s), 3)])
感谢你的大力帮助!
更新 2:
如果你要使用 os.path.join
(就像在我之前的代码中一样),那么它会更加简单,因为 os.path.join
自己会处理参数的格式:
ext_path = [s[0:len(s)%3]] + [s[i:i+3] for i in range(len(s)%3, len(s), 3)]
print(os.path.join('/home', *ext_path))
[line[i-n:i] for i in range(len(line), 0, -n)]
即可得到['890', '567', '234', '']
- turnip