在Python中创建多级字母文件夹结构

时间:2017-02-05 00:05:53

标签: python recursion

我正在尝试编写一个简短的脚本,将数千个文件组织成字母文件夹,任意数量的级别。这是为了允许在旧硬件(例如Amiga 500)上浏览树,而没有任何给定文件夹中的文件数量锁定UI。

E.g。文件'abacus'会进入:

/ A / AB / ABA /算盘

'三角形':

/ T / TR / TRI / triangle

我想将深度指定为单个变量,因此我可以尝试不同数量的级别。三个可能会变得太少或太多。

我正在努力进行必要的递归来创建初始文件夹结构。我可以获取源文件的名称和位置,创建新文件夹并使用os库(分别为walk,mkdir,path.dirname / path.join)在树中上下移动,已经找到了如何将文件复制到它们各自的正确位置以及在复制后删除未使用的文件夹(例如,'/ C / CF / CFZ'路径不太可能以其中的任何文件结束,假设所有文件名都是英文单词)。但是我会在最初的步骤中绕圈子。

非常感谢任何帮助。

的问候。

3 个答案:

答案 0 :(得分:1)

这是一个更优雅的版本:

import os
import itertools

depth = 3

#create the base directory
basepath = 'alphabet'
os.mkdir(basepath)

#setup alphabet list
#alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
alphabet = 'ABC'   #short alphabet for testing purposes

current_path = [basepath]

def create_hierarchy(max_depth, current_path, current_depth=0):
    if current_depth < max_depth:
        for i in alphabet:
            newfolder = (''.join(current_path[-1]) + i) if current_depth != 0 else i
            os.mkdir(os.path.join(*current_path, newfolder))
            create_hierarchy(max_depth, current_path + [newfolder], current_depth + 1)
    else:
        return

create_hierarchy(depth, current_path)

它改编自user3235916的答案。

答案 1 :(得分:0)

这可能是一种更优雅的方式,但这应该有效:

import os
import itertools

depth = 3

#create the base directory
basepath = '/path/to/alphabet'
os.mkdir(basepath)

#setup alphabet list
#long to crate full directory structure
#alphabet = 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'  
alphabet = 'A B C'   #short alphabet for testing purposes
alphabet = alphabet.split()

#helper variable for determining what depth you are at
c_depth = alphabet

#create depth 0
for letter in alphabet:
    #print letter
    pth = os.path.join(basepath,letter)
    os.mkdir(pth)

#
for d in range(depth-1):
    #take the cartesian product of your current directories and your alphabet
    #in order to obtain all possible permutations. Will return tuples like
    #('AAA','B')
    result = list(itertools.product(*(alphabet,c_depth)))
    #print d

    #reset the current directory list
    cdirs = []

    #for each directory at the new depth
    for elem in result:

        #create the full name by joining tuples created previously
        dName =  ''.join(itertools.chain(elem))

        #build up path where it belongs from the letters it is comprised of
        pth = basepath
        for l in range(len(dName)-1):
            pth = os.path.join(pth,dName[:l+1])

        #add the new directory folder to the end of the path
        pth = os.path.join(pth,dName)

        #make new directory
        os.mkdir(pth)
        #print dName
        cdirs.append(dName)

    #reset helper variable
    c_depth = cdirs

答案 2 :(得分:0)

itertools.combinations(iterable,r)可以提供帮助

我只是展示了前5个alpha,不同的r
从combination()输出
中建立你的目录名应该很容易  (它返回一个生成器,需要打印中的*)

import string
from itertools import combinations

print(*combinations(string.ascii_uppercase[0:5], 2), sep='\n')
('A', 'B')
('A', 'C')
('A', 'D')
('A', 'E')
('B', 'C')
('B', 'D')
('B', 'E')
('C', 'D')
('C', 'E')
('D', 'E')

print(*combinations(string.ascii_uppercase[0:5], 3), sep='\n')
('A', 'B', 'C')
('A', 'B', 'D')
('A', 'B', 'E')
('A', 'C', 'D')
('A', 'C', 'E')
('A', 'D', 'E')
('B', 'C', 'D')
('B', 'C', 'E')
('B', 'D', 'E')
('C', 'D', 'E')

print(*combinations(string.ascii_uppercase[0:5], 4), sep='\n')
('A', 'B', 'C', 'D')
('A', 'B', 'C', 'E')
('A', 'B', 'D', 'E')
('A', 'C', 'D', 'E')
('B', 'C', 'D', 'E')