How to Find the Current Working Directory in Python

How to Find the Current Working Directory in Python

Learn how to get current directory (or path) in Python using pathlib and os modules

Python provides two different ways to get the current working directory. The first method uses the os module and the second uses the newer pathlib.

Using the os Module to Get the Current Directory

First thing you need to do is to import the module.

>>> import os

Then, you just need call the getcwd function.

>>> import os
...
>>> os.getcwd()
'/home/miguel'

And that is it! As you can see, the function returns a string. This is not very flexible, what if you want to list all the files in that directory? You will have to call it on os functions again.

The os module is pretty ancient and I wouldn’t recommend using it nowadays. In the following section, I’m going to show you the modern way of getting the current working directory in Python.

Getting the Current Working Directory Through the pathlib Module

The pathlib module was proposed in 2012 and added to Python in the 3.4 version. The idea was to provide an object-oriented API for filesystem paths. This module provides classes that represent the filesystem paths with semantics appropriate for different operating systems. Also, Path objects are immutable and hashable, which helps prevent programming errors caused by mutability.

To get the current working directory using pathlib you can use the classmethod cwd from the Path class. But first, you need to import it.

from pathlib import Path

Them, you can call the method.

>>> from pathlib import Path
...
>>> Path.cwd()
PosixPath('/home/miguel')

As you can see, the output is different than the os.getcwd(). As I mentioned earlier, all paths follow the semantics of the underlying filesystem. In my case, I'm using Linux, so the output is a PosixPath. On Windows, cwd returns a WindowsPath.

Being an object allows many cool functionalities such as iterating over all files just by calling a method. However, If you still want to get the string representation, you can call str on the Path.cwd().

>>> str(Path.cwd())
'/home/miguel'

Path.cwd Under the Hood

How does Path know the current directory? The answer is: it calls the os and returns an instance of Path. The following snippet shows the actual implementation.

    @classmethod
    def cwd(cls):
        """Return a new path pointing to the current working directory
        (as returned by os.getcwd()).
        """
        return cls(os.getcwd())

Wait! On Linux it returns a PosixPath but the class method belongs to Path. How does it know?

Great question! Path does some magic behind the scenes before creating the object. It implements the __new__ magic method and calls os to determine the underlying operating system. Check the implementation.

    def __new__(cls, *args, **kwargs):
        if cls is Path:
            cls = WindowsPath if os.name == 'nt' else PosixPath
        self = cls._from_parts(args, init=False)
        if not self._flavour.is_supported:
            raise NotImplementedError("cannot instantiate %r on your system"
                                      % (cls.__name__,))
        self._init()
        return self

Conclusion

That's it for today, folks! I hope you enjoyed this brief article.

Other posts you may like:

See you next time!

This post was originally published at https://miguendes.me