Reputation: 12101
How to open a file in the parent directory in python in AppEngine?
I have a python file module/mod.py with the following code
f = open('../data.yml')
z = yaml.load(f)
f.close()
data.yml is in the parent dir of module. The error I get is
IOError: [Errno 13] file not accessible: '../data.yml'
I am using AppEngine SDK 1.3.3.
Is there a work around for this?
Upvotes: 35
Views: 70888
Reputation: 2528
@ThatsAmorais answer in a function
import os
def getParent(path: str, levels=1) -> str:
"""
@param path: starts without /
@return: Parent path at the specified levels above.
"""
current_directory = os.path.dirname(__file__)
parent_directory = current_directory
for i in range(0, levels):
parent_directory = os.path.split(parent_directory)[0]
file_path = os.path.join(parent_directory, path)
return file_path
Upvotes: 0
Reputation: 11
I wrote a little function called get_parent_directory() which might help getting the path of the parent directory:
import sys
def get_parent_directory():
list = sys.path[0].split('/')[:-1]
return_str = ''
for element in list:
return_str += element + '/'
return return_str.rstrip('/')
Upvotes: 1
Reputation: 827
🔰🔰 alternative solution 🔰🔰
You can also use the sys
module to get the current working directory.
Thus, another alternative to do the same thing would be:
import sys
f = open(sys.path[0] + '/../data.yml')
Upvotes: 5
Reputation: 659
Having encountered this question and not being satisfied with the answer, I ran across a different solution. It took the following to get what I wanted.
Determine the current directory using os.path.dirname
:
current_directory = os.path.dirname(__file__)
Determine the parent directory using os.path.split
:
parent_directory = os.path.split(current_directory)[0] # Repeat as needed
Join parent_directory with any sub-directories:
file_path = os.path.join(parent_directory, 'path', 'to', 'file')
Open the file:
open(file_path)
Combined together:
open(os.path.join(os.path.split(os.path.dirname(__file__))[0], 'path', 'to', 'file')
Upvotes: 11
Reputation: 185972
The open
function operates relative to the current process working directory, not the module it is called from. If the path must be module-relative, do this:
import os.path
f = open(os.path.dirname(__file__) + '/../data.yml')
Upvotes: 58