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:
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