Simplify the directory path in Python

In this post, we will learn how to simplify a directory path from absolute to canonical using the Python Programming language.

The absolute path is used in UNIX/bash which needs to be simplified to its canonical path in order to work with further tasks thereby increasing portability of a program.

What is Canonical path?

A Canonical path is defined as the shortest string representing the absolute path which is unique, it cleans up the absolute path by resolving stuff like ., .. , successive /.

Properties of a canonical path:-

  • The path must always begin with a /
  • Consecutive / between two directory names are not allowed
  • Last directory name should not end with /

code explanation

As we can see that the operations perform well when we consider this as a stack. Whenever we encounter a directory we push it onto the stack, if we encounter a period .., we pop the previous directory element else, we continue.

  • Let us consider a list st and put ‘/‘ onto it.
  • The test is the list of strings after splitting the path with the delimiter provided.
  • Looping for all the elements in the test
    • if i is .. then,
      • if st>1 then, pop from st, else continue
    • else if i is . , then continue
    • else if it is not an empty string hence concatenate i with / and store into st
  • if only one element, return /
  • return after concatenating all elements present  in st

Code

class soln:
    def SimplifyPath(self,test):
        st = ['/']
        test = test.split("/")

        for i in test:
              if i == "..":
                  if len(test)>1:
                      test.pop()
                  else:
                      continue
                  
              elif (i == '.'):
                        continue
                    
              elif i != '':
                        st.append("/" + str(i))

         if len(st)==1:
            return "/"
         return "".join(st[1:])
    
ob=soln()

print(ob.SimplifyPath("/home/"))
    

output

Input : /home/
Output : /home

Input : /a/./b/../../c/
Output : /c

Input : /a/..
Output:/

Input : /a/../
Output : /

Input : /../../../../../a
Output : /a

Input : /a/./b/./c/./d/
Output : /a/b/c/d

Input : /a/../.././../../.
Output:/

Input : /a//b//c//////d
Output : /a/b/c/d

 

Leave a Reply

Your email address will not be published. Required fields are marked *