\(\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.pathdirname, 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')