marlon
marlon

Reputation: 7723

How do I get correct path by absolute or relative path?

My file structure is as follows:

kkg/
  builder/test.py
  builder/data
  api/api.py
  __init__py

'kkg' is my package name, and in init.py some function are defined, and implementations of these function are written api.py.

In test.py, I have:

import kkg
kkg.load('builder/data/')

Inside the 'load' of the api.py, I have code:

abspath = os.path.abspath(os.path.dirname(__file__))
...

for file in files:
    file_path = os.path.join(abspath, data_path)

The data_path is the parameter 'builder/data/' passed from test.py. The path.join reports an error:

Caused by: java.io.FileNotFoundException: /Users/comin/kkg/kkg/api/data/people.csv 

The correct data path, if parsed properly, should be:

/Users/comin/kkg/kkg/data/people.csv

I run the 'test.py' inside the builder/ directory. I think the reason there is an unnecessary 'api' in the path generated is because the code piece where error occurs in the api.py.

Perhaps I shouldn't use the join(abspath, data_path) to get the absolute directory. How to get the path correctly parsed?

EDIT:

I changed the path parameter:

kkg.load('../builder/data/')

but then this code failed:

if not os.path.isdir(data_path):
        raise ValueError('data_path must be a directory, not file name!') 

Why does it raise an error when I added '..' to the path? It is not considered as a directory due to the '..'?

Upvotes: 0

Views: 124

Answers (2)

Prayson W. Daniel
Prayson W. Daniel

Reputation: 15588

It is much easier to use pathlib over os library:

# api/api.py

from pathlib import Path

KKG_FOLDER = Path(__file__).parent.parent
DATA_FOLDER = KKG_FOLDER / 'builder/data'

print(DATA_FOLDER)

This is more verbose and easier to understand.

Upvotes: 1

Joran Beasley
Joran Beasley

Reputation: 114098

you want the parent directory I think

abspath = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))

you seem to be struggling with this more than you should...it might be easier to just do

path_to_data_file_folder = os.path.abspath(sys.argv[1])

then call it with python main.py /path/to/data/folder

Upvotes: 1

Related Questions