python - Why is os.rename program not sorting directory -
i have program trying write take large directory (10,000+files inside) , create new sub directories break large directory smaller chunks (of approximately 100 files each).the program have raises no errors when call in terminal, not sort large file... think problem os.rename() dont understand why tried shutil.move() , still had same problem. sorry couldent make code appear in color new site
#!/usr/bin/python import os import glob import sys functools import partial sys.setrecursionlimit(1000) def mk_osdict(a): #os.chdir(a) #grouping files .mol2 endings os_list =glob.glob("*.mol2") #making dictionary list of files in directory os_dict = dict([i,n] i,n in zip(range(len(os_list)),os_list)) return os_dict dict_os = mk_osdict("decoys") #function sort files new directories specific size. def init_path(f): block = (len(f)/100)+1 #i_lst gives list of number of entries i_lst = [str(i) in range(block)] '''paths keys become new directories, values list files sorted corresponding directory''' paths = dict(["decoydir"+n.zfill(5),[]] n in i_lst) lst in paths.values(): while len(lst) <= block: value in f.values(): lst.append(value) x,p in paths: if not os.path.exists(x): os.mkdir(x) else: pass index in p: yield os.rename(index,os.path.join(x,index)) b = init_path(dict_os )
you can perform task more using few list manipulations on the files returned glob
. creating intermediate data structures makes code more confusing - can directory creation , moves go:
import os import glob
def mk_tree(path): files = glob.glob(os.path.join(path, "*.mol2")) chunks = [files[chunk:chunk+100] chunk in range(0, len(files), 100)] i, chunk in enumerate(chunks): new_dir = os.path.join(path, "decoydir%05d" % i) os.mkdir(new_dir) fn in chunk: os.rename(fn, os.path.join(new_dir, os.path.basename(fn)))
Comments
Post a Comment