===== find depth =====
==== find depth of a file or directory ====
import os
def get_depth(file_or_dir_path):
abs_path = os.path.abspath(os.path.expanduser(file_or_dir_path))
depth = os.path.normpath(abs_path).count(os.sep)
return depth
Examples:
In [2]:
os.path.abspath(os.path.expanduser('~'))
Out[2]:
'/home/rajulocal'
In [3]:
[get_depth('~'), get_depth('/home/rajulocal'), get_depth('/home/rajulocal/'),
get_depth('/home/rajulocal/foo'), get_depth('/'), get_depth('/home')]
Out[3]:
[2, 2, 2, 3, 1, 1]
Using Python 3.10.6, Ipython 8.6.0
tags | measure the depth of a file system path
See also:
* https://stackoverflow.com/questions/31528199/how-to-measure-the-depth-of-a-file-system-path - shows how to do it with various command line tools.
* https://docs.python.org/3/library/os.path.html
==== depth of a directory relative to a parent directory ====
tags | relative path
import os
def dir_depth_relative(child, parent):
child = os.path.abspath(os.path.expanduser(child))
parent = os.path.abspath(os.path.expanduser(parent))
assert child.startswith(parent), "child parent relation violated. parent = " + parent + ', child = ' + child
name_space = os.path.relpath(child, parent)
level = os.path.normpath(name_space).count(os.sep) + 1 if name_space != '.' else 0
return level
Examples:
In [2]:
[dir_depth_relative('~', '~'), dir_depth_relative('~', '~/'),
dir_depth_relative('~/work', '~'), dir_depth_relative('~/work.txt', '~'),
dir_depth_relative('/tmp/foo', '/tmp'), dir_depth_relative('/tmp', '/tmp'),
dir_depth_relative('/tmp/foo/bar', '/tmp')]
Out[2]:
[0, 0, 1, 1, 1, 0, 2]
In [3]:
dir_depth_relative('/tmp', '/tmp/foo')
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
Cell In [3], line 1
----> 1 dir_depth_relative('/tmp', '/tmp/foo')
Cell In [1], line 6, in dir_depth_relative(child, parent)
4 child = os.path.abspath(os.path.expanduser(child))
5 parent = os.path.abspath(os.path.expanduser(parent))
----> 6 assert child.startswith(parent), "child parent relation violated. parent = " + parent + ', child = ' + child
7 name_space = os.path.relpath(child, parent)
8 level = os.path.normpath(name_space).count(os.sep) + 1 if name_space != '.' else 0
AssertionError: child parent relation violated. parent = /tmp/foo, child = /tmp