Open file in a relative location in Python Open file in a relative location in Python python python

Open file in a relative location in Python


With this type of thing you need to be careful what your actual working directory is. For example, you may not run the script from the directory the file is in. In this case, you can't just use a relative path by itself.

If you are sure the file you want is in a subdirectory beneath where the script is actually located, you can use __file__ to help you out here. __file__ is the full path to where the script you are running is located.

So you can fiddle with something like this:

import osscript_dir = os.path.dirname(__file__) #<-- absolute dir the script is inrel_path = "2091/data.txt"abs_file_path = os.path.join(script_dir, rel_path)


This code works fine:

import osdef readFile(filename):    filehandle = open(filename)    print filehandle.read()    filehandle.close()fileDir = os.path.dirname(os.path.realpath('__file__'))print fileDir#For accessing the file in the same folderfilename = "same.txt"readFile(filename)#For accessing the file in a folder contained in the current folderfilename = os.path.join(fileDir, 'Folder1.1/same.txt')readFile(filename)#For accessing the file in the parent folder of the current folderfilename = os.path.join(fileDir, '../same.txt')readFile(filename)#For accessing the file inside a sibling folder.filename = os.path.join(fileDir, '../Folder2/same.txt')filename = os.path.abspath(os.path.realpath(filename))print filenamereadFile(filename)


I created an account just so I could clarify a discrepancy I think I found in Russ's original response.

For reference, his original answer was:

import osscript_dir = os.path.dirname(__file__)rel_path = "2091/data.txt"abs_file_path = os.path.join(script_dir, rel_path)

This is a great answer because it is trying to dynamically creates an absolute system path to the desired file.

Cory Mawhorter noticed that __file__ is a relative path (it is as well on my system) and suggested using os.path.abspath(__file__). os.path.abspath, however, returns the absolute path of your current script (i.e. /path/to/dir/foobar.py)

To use this method (and how I eventually got it working) you have to remove the script name from the end of the path:

import osscript_path = os.path.abspath(__file__) # i.e. /path/to/dir/foobar.pyscript_dir = os.path.split(script_path)[0] #i.e. /path/to/dir/rel_path = "2091/data.txt"abs_file_path = os.path.join(script_dir, rel_path)

The resulting abs_file_path (in this example) becomes: /path/to/dir/2091/data.txt