Using the os.path module#

The os.path module is one of two ways of manipulating and using file paths in Python. See the path manipulation page for more discussion, and pathlib page for a tutorial on the alternative pathlib approach.

The primary documentation for os.path is https://docs.python.org/3/library/os.path.html

This page covers:

  • os.path

  • dirname, basename, join, splitext, abspath

import os.path

In IPython, you can tab complete on os.path to list the functions and attributes there.

The first function we will use from os.path is dirname. To avoid typing os.path all the time, we import os.path with the shortened name op:

import os.path as op
op.dirname
<function posixpath.dirname(p)>

The dirname function gives the directory name from a full file path. It works correctly for Unix paths on Unix machines, and Windows paths on Windows machines:

# On Unix
op.dirname('/a/full/path/then_filename.txt')
'/a/full/path'

You’ll see something like this as output if you run something similar on Windows. So op.dirname('c:\\a\\full\\path\\then_filename.txt') will give:

'c:\\a\\full\\path'

Notice that, on Windows, you need to use double backslashes, because the backslash in a Python string is a way of escaping a character — meaning, to specify you mean exactly that character. Double backslash has the meaning “Yes, I do mean exactly backslash for the next character”.

dirname also works for relative paths, A relative path where the starting directory is relative to the current directory, rather than absolute, in terms of the root of the file system:

# On Unix
op.dirname('relative/path/then_filename.txt')
'relative/path'

Use basename to get the filename rather than the directory name:

# On Unix
op.basename('/a/full/path/then_filename.txt')
'then_filename.txt'

Sometimes you want to join one or more directory names with a filename to get a path. Windows and Unix have different characters to separate directories in a path. Windows uses the backslash: \, Unix uses a forward slash: /. If your code will run on Windows and Unix, you need to take care that you get the right character joining your paths. This is what os.path.join does:

# On Unix
op.join('relative', 'path', 'then_filename.txt')
'relative/path/then_filename.txt'

This also works on Windows. op.join('relative', 'path', 'then_filename.txt') gives output 'relative\\path\\then_filename.txt'.

To convert a relative to an absolute path, use abspath:

# Show the current working directory
os.getcwd()
op.abspath('relative/path/then_filename.txt')
'/home/runner/work/textbook/textbook/relative/path/then_filename.txt'

Use splitext to split a path into: the path + filename; and the file extension:

op.splitext('relative/path/then_filename.txt')
('relative/path/then_filename', '.txt')