Open file in a relative location in 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 cant 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 os
script_dir = os.path.dirname(__file__) #<-- absolute dir the script is in
rel_path = 2091/data.txt
abs_file_path = os.path.join(script_dir, rel_path)
This code works fine:
import os
def 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 folder
filename = same.txt
readFile(filename)
#For accessing the file in a folder contained in the current folder
filename = os.path.join(fileDir, Folder1.1/same.txt)
readFile(filename)
#For accessing the file in the parent folder of the current folder
filename = 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 filename
readFile(filename)
Open file in a relative location in Python
I created an account just so I could clarify a discrepancy I think I found in Russs original response.
For reference, his original answer was:
import os
script_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 os
script_path = os.path.abspath(__file__) # i.e. /path/to/dir/foobar.py
script_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