Warning

File System

Working with directories

It is quite likely that you will want to either use data from a file or to write data into a file. The filename will usually be in one variable (i.e. fname) and the path in another (i.e. fpath). To access the file, you have to join those with a correct separator. For Unix/Linux it is /, for Windows it is \, which, however, has to written as \\. (Because \ is used to write special characters)

You do not have to worry about OS detection, just use standard module os. I.E. the os.sep variable always contains the right separator for the case. So, the following code

>>> import os
>>> fpath = 'filepath'
>>> fname = 'filename'
>>> fpath + os.sep + fname
will have this output under Windows
'filepath\\filename'
and this output under Linux
'filepath/filename'

We could also use the os.path.join() function. Thus

>>> os.path.join(fpath, fname)
will give same output as the above examples using os.sep. Another advantage of using os.path.join() is also that it deals with cases when fpath already contains a separator.

Saving file to current directory

You will also want your code to be able to save some data for later use. The most logical place for this is the same directory your program is in (or its subdirectory). You will probably think of using relative path, which derives the file location from the current directory. So, if you run your script script.py which contains

f = open('data.txt','w')
the new file file, data.txt will be created in the same directory script.py is in.

Problems begin, when your script script.py is imported in other modules and those try to use it, because in this case, current directory is the directory the main script is run from.

If you want to always save the new file relative to the imported module, you can use

fpath = os.path.dirname( os.path.abspath(__file__) )
However, this construction can fail, if we do not import the module, but run it, i.e. using execfile(), because in this case the file variable does not get set.

Completely universal way to do this uses inspect module.

import inspect
fpath = os.path.dirname( inspect.getfile( inspect.currentframe() ) )