Created
June 24, 2013 12:56
-
-
Save zupo/5849843 to your computer and use it in GitHub Desktop.
Split a folder with many files into subfolders with N files. Usage: python folder_splitter.py path/to/target/folder
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # -*- coding: utf-8 -*- | |
| # @author: Peter Lamut | |
| import argparse | |
| import os | |
| import shutil | |
| N = 10 # the number of files in seach subfolder folder | |
| def move_files(abs_dirname): | |
| """Move files into subdirectories.""" | |
| files = [os.path.join(abs_dirname, f) for f in os.listdir(abs_dirname)] | |
| i = 0 | |
| curr_subdir = None | |
| for f in files: | |
| # create new subdir if necessary | |
| if i % N == 0: | |
| subdir_name = os.path.join(abs_dirname, '{0:03d}'.format(i / N + 1)) | |
| os.mkdir(subdir_name) | |
| curr_subdir = subdir_name | |
| # move file to current dir | |
| f_base = os.path.basename(f) | |
| shutil.move(f, os.path.join(subdir_name, f_base)) | |
| i += 1 | |
| def parse_args(): | |
| """Parse command line arguments passed to script invocation.""" | |
| parser = argparse.ArgumentParser( | |
| description='Split files into multiple subfolders.') | |
| parser.add_argument('src_dir', help='source directory') | |
| return parser.parse_args() | |
| def main(): | |
| """Module's main entry point (zopectl.command).""" | |
| args = parse_args() | |
| src_dir = args.src_dir | |
| if not os.path.exists(src_dir): | |
| raise Exception('Directory does not exist ({0}).'.format(src_dir)) | |
| move_files(os.path.abspath(src_dir)) | |
| if __name__ == '__main__': | |
| main() |
I combined @hyzyla's python3 edit
With python3, I got error
subdir_name = os.path.join(abs_dirname, '{0:03d}'.format(i / N + 1)) ValueError: Unknown format code 'd' for object of type 'float'Fixed by updating line 22:
subdir_name = os.path.join(abs_dirname, '{0:03d}'.format(i // N + 1))
with @ajeema's sequential edit
If anyone has sequential images that you want to keep order, replace line 14 with:
files = sorted([os.path.join(abs_dirname, f) for f in os.listdir(abs_dirname)])
and it was EXACTLY what I needed to peruse thousands of images without crashing Explorer every time it tries to load the thumbnails. Tysm!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks, very useful.
Had 29,000 batch-downloaded Sporepedia creations and found that Spore had a limit to how many files could be dropped in at a time. This saved so much time