\(\newcommand{L}[1]{\| #1 \|}\newcommand{VL}[1]{\L{ \vec{#1} }}\newcommand{R}[1]{\operatorname{Re}\,(#1)}\newcommand{I}[1]{\operatorname{Im}\, (#1)}\)
Making and breaking file paths in Python¶
See: https://docs.python.org/3.5/library/os.path.html
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.dirname
all the time, import the dirname
function
directly into the current name-space, by using the from module import ...
version of the import
command:
>>> from os.path import dirname
>>> dirname
<function dirname at 0x...>
>>> # This gives "os.path.dirname" the name "dirname"
>>> os.path.dirname
<function dirname at 0x...>
>>> dirname is os.path.dirname
True
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
>>> dirname('/a/full/path/then_filename.txt')
'/a/full/path'
Note
Windows, backslash and strings
On Windows, we have the extra problem that Python uses the backslash character
in strings to indicate a special character follows. For example the string
"Tab \t, newline \n"
contains a tab character and a newline character,
indicated by "\t"
and "\n"
. So we need to prepend a backslash to
each backslash we want in the output string:
>>> # On Windows
>>> dirname('c:\\a\\full\\path\\then_filename.txt')
'c:\\a\\full\\path'
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
>>> dirname('relative/path/then_filename.txt')
'relative/path'
Use basename
to get the filename rather than the directory name:
>>> from os.path import basename
>>> # On Unix
>>> 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:
>>> from os.path import join
>>> # On Unix
>>> join('relative', 'path', 'then_filename.txt')
'relative/path/then_filename.txt'
This also works on Windows:
>>> # On Windows
>>> join('relative', 'path', 'then_filename.txt')
'relative\\path\\then_filename.txt'
To convert a relative to an absolute path, use abspath
:
>>> from os.path import abspath
>>> # Show the current working directory
>>> os.getcwd() #doctest: +SKIP
/Users/mb312/dev_trees/psych-214-fall-2016
>>> abspath('relative/path/then_filename.txt') #doctest: +SKIP
/Users/mb312/dev_trees/psych-214-fall-2016/relative/path/then_filename.txt
Use splitext
to split a path into: the path + filename; and the file
extension:
>>> from os.path import splitext
>>> splitext('relative/path/then_filename.txt')
('relative/path/then_filename', '.txt')