Generate directory tree diagrams from the command line
Project description
Pyletree
Pyletree is a simple and fast CLI tool to generate directory tree diagrams.
Table of Contents
- Installation
- Usage
- Options
- Examples
- Python API
- Sample Output
- Features
- Release History
- Authors
- License
Installation
From PyPI
pip install pyletree
Local
git clone https://github.com/davi-furtado/pyletree.git
cd pyletree
pip install -e .
Documentation
- Live docs: https://davi-furtado.github.io/pyletree
- Docs are automatically rebuilt on push to
mainvia GitHub Actions.
Usage
pyletree [ROOT_DIR]
If no directory is provided, the current directory is used:
pyletree
Show help:
pyletree -h
Options
General
-h,--helpShow help message-v,--versionShow version
Modes
-do,--dir-onlyShow directories only-fo,--files-onlyShow files only
Ordering
-d,--dirs-firstList directories before files-f,--files-firstList files before directories-r,--reverseReverse alphabetical sort order
Alphabetical order is always applied as base sorting.
Size
-fs,--file-sizeDisplay individual file sizes-ds,--dir-sizeDisplay cumulative sizes for directories-b,--big-firstOrder entries by size (largest first)-s,--small-firstOrder entries by size (smallest first)
Size sorting (
-b/-s) is mutually exclusive with ordering (-d/-f).
Display
-n,--no-pipesRemove vertical pipes between branches-p,--path-treeGenerate a view focused exclusively on full paths-t [N],--text-only [N]Text-only mode: tree in plain text withNspaces indentation (default: 2). Cannot be used with-n
Ignoring
-git [DIR ...],--git [DIR ...]Ignore.gitfolder and respect rules from given.gitdirectories or directories containing.git(defaults to current dir if omitted but flag is used)-g [DIR_OR_FILE ...],--gitignore [DIR_OR_FILE ...]Respect.gitignorerules from given paths/dirs (defaults to current dir if omitted)-i PATTERN [PATTERN ...],--ignore PATTERN [PATTERN ...]Ignore files/directories matching gitignore-style patterns-fi PATTERN [PATTERN ...],--filter PATTERN [PATTERN ...]Include only files or directories matching gitignore-style patterns
Depth
-dl N,--depth-level NLimit tree depth (must be >= 0)
Output Formats
-dt [N],--dict-tree [N]Output the tree structure as a JSON dictionary.Ndefines indentation spaces for CLI display only (default: 2). Use0for compact output
Examples
Basic:
pyletree
Directories first:
pyletree . -d
Files only:
pyletree . -fo
Limit depth:
pyletree . -dl 2
Dictionary output:
pyletree . -dt 4
Ignore entries:
pyletree . -i node_modules dist .git
Filter entries with patterns:
pyletree . -fi *.py docs/
Use .gitignore:
pyletree . -g
No pipes mode:
pyletree . -n
Show file sizes:
pyletree . -fs
Show directory sizes:
pyletree . -ds
Sort by size (biggest first):
pyletree . -b -fs
Sort by size (smallest first):
pyletree . -s -fs
Reverse alphabetical order:
pyletree . -r
Path tree mode:
pyletree . -p
Text-only mode (4-space indent):
pyletree . -t 4
Git mode (ignore .git and apply .gitignore rules):
pyletree . -git
Combine options:
pyletree src/ -d -fs -dl 3 -i __pycache__
Python API
You can also use Pyletree programmatically in your own Python code using the FileTree class. It returns an iterable that can also be printed directly.
Basic Usage
from pyletree import FileTree
# Create a tree for the current directory
tree = FileTree()
# Print the tree directly
print(tree)
# Or iterate over its lines
for line in tree:
print(line)
# You can configure it with the same options of the CLI
custom_tree = FileTree(
root_dir='src/',
dir_only=True,
ignore=['__pycache__']
)
print(custom_tree)
Parameters
All parameters (except root_dir) are keyword-only:
| Parameter | Type | Default | Description |
|---|---|---|---|
root_dir |
str | Path |
'.' |
Root directory path |
dir_only |
bool |
False |
Show directories only |
files_only |
bool |
False |
Show files only |
dirs_first |
bool |
False |
List directories before files |
files_first |
bool |
False |
List files before directories |
no_pipes |
bool |
False |
Remove vertical pipes between branches |
ignore |
list[str] | None |
None |
Gitignore-style patterns to ignore |
filter |
list[str] | None |
None |
Gitignore-style patterns to include only |
use_gitignore |
bool | str | Path | list |
False |
Respect .gitignore rules. True uses current dir, or pass path(s) |
depth_level |
int | None |
None |
Limit tree depth |
path_tree |
bool |
False |
Display full paths instead of names |
text_only |
bool |
False |
Plain text mode (no special characters) |
text_only_indent |
int |
2 |
Indentation spaces for text-only mode |
file_size |
bool |
False |
Show individual file sizes |
dir_size |
bool |
False |
Show cumulative directory sizes |
sort_size |
str | None |
None |
Sort by size: 'big' or 'small' |
reverse |
bool |
False |
Reverse alphabetical sort order |
Methods
get_tree() -> str
Returns the tree as a formatted string:
tree = FileTree('src/')
output = tree.get_tree()
get_dict_tree() -> dict
Returns the tree as a nested dictionary-like structure.
When file_size=False folder contents are represented as lists of names and nested dictionaries:
tree = FileTree('src/')
data = tree.get_dict_tree()
# {'src/': ['main.py', 'utils.py', {'subfolder': ['README.md']}]}
# With file sizes
tree = FileTree('src/', file_size=True)
data = tree.get_dict_tree()
# {'src/': {'main.py': '1.2 KB', 'utils.py': '856 B'}}
get_path(pattern) -> list[Path]
Search for files or directories matching a pattern. Returns a list of resolved Path objects:
tree = FileTree()
# Exact name match
tree.get_path('main.py')
# Glob pattern
tree.get_path('*.py')
# Path pattern
tree.get_path('src/*.py')
dict(tree)
FileTree supports dict() conversion through keys() and __getitem__():
tree = FileTree('src/')
data = dict(tree)
Iterating
FileTree is iterable — each iteration yields one line of the tree:
tree = FileTree()
for line in tree:
print(line)
String conversion
str(tree) or print(tree) returns the full tree as a string:
tree = FileTree()
print(tree) # prints the tree
text = str(tree) # stores as string
Sample Output
Default
project/
│
├── src/
│ ├── main.py
│ └── utils.py
│
├── tests/
│ └── test_main.py
│
└── README.md
No pipes (-n)
project/
├── src/
│ ├── main.py
│ └── utils.py
├── tests/
│ └── test_main.py
└── README.md
Text-only mode (-o)
project/
src/
main.py
utils.py
tests/
test_main.py
README.md
Path tree (-p)
C:/Users/user/project/
│
├── C:/Users/user/project/src/
│ ├── C:/Users/user/project/src/main.py
│ └── C:/Users/user/project/src/utils.py
│
├── C:/Users/user/project/tests/
│ └── C:/Users/user/project/tests/test_main.py
│
└── C:/Users/user/project/README.md
File sizes (-fs)
project/
│
├── src/
│ ├── main.py (1.2 KB)
│ └── utils.py (856 B)
│
├── tests/
│ └── test_main.py (420 B)
│
└── README.md (3.1 KB)
Directory sizes (-ds)
project/ (5.6 KB)
│
├── src/ (2.1 KB)
│ ├── main.py
│ └── utils.py
│
├── tests/ (420 B)
│ └── test_main.py
│
└── README.md
Dictionary output (-dt)
{
"project/": {
"src/": {
"main.py": null,
"utils.py": null
},
"tests/": {
"test_main.py": null
},
"README.md": null
}
}
Features
- Clean and readable tree output
.gitignoresupport (it does not ignore either the.gitdirectory or the.gitignorefile; if you want to ignore them, add them to the ignore patterns)- Custom ignore patterns
- Include-only filter patterns with smart directory inclusion
- Depth limiting
- Flexible sorting (alphabetical, directories/files first, by size)
- Reverse sort order
- File and directory size display
- Path-focused tree view
- Text-only mode with configurable indentation
- Dictionary (JSON) output format
- Optional compact mode (
--no-pipes) - Full Python API with
FileTreeclass
Release History
2.6.2
Internal improvements
2.6.1
Bug fixes & Improvements
2.6.0
Enhancements
- Added
--text-onlyalias for the-toption. - Swapped CLI short aliases for git mode and gitignore mode:
-gitnow maps to--git-gnow maps to--gitignore
- Added optional
Nindentation parameter to-dt/--dict-treefor CLI display (default 2, 0 for compact output). - Updated documentation and examples to reflect the new CLI aliases and
dict-treedisplay behavior.
2.5.0
Enhancements
- Added comprehensive docstrings across the
FileTreeclass and CLI entry points. - Improved typing annotations for
FileTree, including iterator and mapping return types. - Updated public Python API to snake_case method names and aligned README documentation.
2.4.0
API Changes
FileTreeinstance attributes are now public. All user-configured parameters (root_dir,dir_only,files_only,dirs_first,files_first,no_pipes,ignore,depth_level,path_tree,text_only,text_only_indent,file_size,dir_size,sort_size,reverse) can be accessed directly without the_prefix.- Example:
tree.root_dir,tree.depth_level,tree.dir_only - Internal attributes (
_tree_deque,_size_cache,_gitignore_list,_filter_cache,_ignore_spec,_filter_spec) remain private.
- Example:
Documentation
- Complete README with all CLI options, full API reference, and expanded examples.
2.3.1
- Improve README.md
- Improve code
2.3.0
Enhancements
- Integrated
-di/--dict-indentinto-dt/--dict-tree.- Example:
pyletree . -dt 4(4-space indentation) - Example:
pyletree . -dt 0(compact, no indentation)
- Example:
2.2.0
Enhancements
-dt/--dict-tree| Enhanced Dictionary Output: improved dictionary format with configurable indentation. Now returns{root: {tree...}}format and supports custom indentation via-dt N/--dict-tree N(default 2).- Example:
pyletree . -dt 4(4-space indentation) - Example:
pyletree . -dt 0(compact, no indentation) - Better structured output for programmatic use
- Example:
2.1.0
New Features
-fi/--filter| Include Patterns: display only files and directories matching gitignore-style patterns. Supports multiple patterns and maintains tree hierarchy by including parent directories of matching files.- Example:
pyletree . -fi *.py src/ - Smart directory inclusion: shows parent folders even if they don't match the pattern directly
- Caching optimization for large directory trees
- Example:
2.0.1
-g/--gitnow accepts only directories or.gitdirectories, or directories containing a.gitfolder.-gi/--gitignorecontinues to accept either a.gitignorefile or the containing directory.
2.0.0
Visual & Metadata
-p/--path-tree| Path Tree: generates a view focused exclusively on the paths of files and directories.-t [N]| Text-Only Mode: generates the tree in plain text (without special characters). Accepts an optional parameterNto define the indentation (default: 2 spaces). Can't be used with-n.-fs/--file-size| File Sizes: toggle visibility of individual file sizes.-ds/--dir-size| Directory Sizes: display cumulative sizes for folders.- [
-b/--big-first|-s/--small-first] | Smart Sorting: order tree entries by size (descending/ascending).
Filtering & Data Structures
-dt/--dict-tree| Dictionary format: output the tree structure as a native Python dictionary. Use-dt N/--dict-tree Nfor indentation (default 2). Format: {root: {tree...}}- Global File Filter: support for excluding/including files based on patterns or extensions.
- Add patterns to
-i/--ignoreoption.
API Enhancements
FileTree.get_path(pattern): new method to programmatically retrieve the full path of a specific file or directory within the tree.- Add
dict(FileTree)method to convert the tree to a dictionary. - Add
FileTree.get_tree()method to convert the tree to a string. - Add
FileTree.get_dict_tree()method to convert the tree to a dictionary.
1.1.0
- Removed
-o/--output-fileoption - Added
FileTreeclass for programmatic usage in Python scripts.
1.0.0
- Initial release
Authors
Davi Reis Furtado
Original RP Tree Author: Leodanis Pozo Ramos
License
Pyletree is distributed under the MIT license. See LICENSE for more information.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyletree-2.6.2.tar.gz.
File metadata
- Download URL: pyletree-2.6.2.tar.gz
- Upload date:
- Size: 18.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf5f3ce1fea6cfab73389f83fbad3818dbef7b315f4148c0daef8796f0423787
|
|
| MD5 |
dc5a21443f13dd0c6aeaac855e425a27
|
|
| BLAKE2b-256 |
5809112760d422c74c71ee906cde2221c34d30b75136459e484bf3efaae2a35a
|
File details
Details for the file pyletree-2.6.2-py3-none-any.whl.
File metadata
- Download URL: pyletree-2.6.2-py3-none-any.whl
- Upload date:
- Size: 15.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ad35aa045ecc8ea58712fb978ec6251a780d8f7e5a1c0c92f08ce20a5f834c8
|
|
| MD5 |
7729f799236c00a5e1925b3b547c012d
|
|
| BLAKE2b-256 |
2c60b460d473bbe46a6372555c9f374d059b2d25df3f734e95934805632de2b6
|