Create a random file and directory tree/structure for testing purposes.
This is done in an iterative fashion: For every iteration, files and folders are created based on set probabilities in all subfolders of the target folder.
randomfiletree
can be installed with the python package manager:
pip3 install randomfiletree
For a local installation, you might want to use the --user
switch of
pip
. You can also update your current installation with
pip3 install --upgrade randomfiletree
.
For the latest development version you can also work from a cloned version of this repository:
git clone https://github.com/klieret/randomfiletree/
cd randomfiletree
pip3 install --user .
Take a look at the documentation for the complete picture.
Simple command line interface:
randomfiletree <output folder> \
-f <average number of files> \
-d <average number of folders> \
-r <repeat>
For example, using the options -f 3 -d 2 -r 2
, on average 2 folders and 3
files are created in the first iteration, and another 2 folders and 3 files are
added to the output directory and each of its subdirectories in the second
iteration.
Type randomfiletree -h
to see all supported arguments.
import randomfiletree
randomfiletree.iterative_gaussian_tree(
"/path/to/basedir",
nfiles=2.0,
nfolders=0.5,
maxdepth=5,
repeat=4
)
Randomfiletree will now crawl through all directories in
/path/to/basedir
and create new files with the probabilities given in
the arguments.
It is possible to pass an optional function to generate the random filenames oneself:
import random
import string
def fname():
length = random.randint(5, 10)
return "".join(
random.choice(string.ascii_uppercase + string.digits)
for _ in range(length)
) + '.docx'
randomfiletree.core.iterative_gaussian_tree(
"/path/to/basedir",
nfiles=100,
nfolders=10,
maxdepth=2,
filename=fname
)
The payload
optional argument can be used to generate file contents
together with their names. For example, it can be used to replicate some
template files with randomized names:
import itertools
import pathlib
import randomfiletree
def callback(target_dir: pathlib.Path) -> pathlib.Path:
sourcedir = pathlib.Path("/path/to/templates/")
sources = []
for srcfile in sourcedir.iterdir():
with open(srcfile, 'rb') as f:
content = f.read()
sources.append((srcfile.suffix, content))
for srcfile in itertools.cycle(sources):
path = target_dir / (randomfiletree.core.random_string() + srcfile[0])
with path.open('wb') as f:
f.write(srcfile[1])
yield path
randomfiletree.core.iterative_gaussian_tree(
"/path/to/basedir",
nfiles=10,
nfolders=10,
maxdepth=5,
repeat=4,
payload=callback
)
if both filename
and payload
passed, the first option is ignored.
Thanks goes to these wonderful people (emoji key):
Heshanthaka 💻 |
Nicholas Bollweg 💻 |
Vadym Markov 💻 |
This project follows the all-contributors specification. Contributions of any kind welcome!