如何在python中获取项目根目录下的子文件夹路径?

问题描述 投票:0回答:3

不得不再次发布这个问题,因为我的上一个问题已经关闭,说我的问题不集中。所以我在这里再试一次。

我的文件夹结构如下所示:

root_folder:
    - core
    - files
    - solution
        - sub_folder
             - test.py 
    - tests

我需要从python文件

files
中获取子文件夹
test.py
的绝对路径。

尝试过使用

os.path.abs
os.path.dirname
的各种方法,但对我不起作用。

如有任何帮助,我们将不胜感激。

测试代码和输出:

print(os.path.join(os.path.dirname(os.path.dirname(__file__)), 'files'))

输出:

/home/kulasangar/Documents/bst_work/root_folder/solution/files

预期输出:

/home/kulasangar/Documents/bst_work/root_folder/files

python python-3.x
3个回答
2
投票

您可以使用

sys.path
从代码中的任何位置访问项目的根目录。

import sys
print('My nested folder : ', os.getcwd())
print('File name : ', os.path.basename(__file__))
print('Root path:', sys.path[1])

假设您发布的文件夹结构相同,我的项目文件夹名为

testing
。所以,输出是

My nested folder :  /Users/hellbreak/Documents/Coding/Python Lab/testing/solutions/sub_folder
File name :  test.py
Root path: /Users/hellbreak/Documents/Coding/Python Lab/testing

然后,如果您对特定路径感兴趣,您可以

print('My nested folder : ', os.getcwd())
print('File name : ', os.path.basename(__file__))
print('Root path:', sys.path[1]+'/files')

输出:

My nested folder :  /Users/hellbreak/Documents/Coding/Python Lab/testing/solutions/sub_folder
File name :  test.py
Root path: /Users/hellbreak/Documents/Coding/Python Lab/testing/files

0
投票

在@hellbreak的回答之上,我想出了另一种方法:

from pathlib import Path
import os

current_dir = Path(__file__)
project_root_dir_path = [p for p in current_dir.parents if p.parts[-1] == 'root_folder'][0]
files_path = os.path.join(project_root_dir_path, 'files')

0
投票

sys.path
返回项目的所有相关路径。

sys.path
的第一项是正在执行的文件的路径。如果正在执行的文件位于项目的根路径中,则
sys.path
的第一个索引将是项目的根路径。

如果正在执行的文件位于项目根路径的子目录中,则可以是从 1 到 sys.path 长度的任意条目。大多数时候它位于第二个条目,索引为 1。无论如何,项目的根路径位于

sys.path
中。就我而言,它是索引 1 中的
C:\Users\username\Python\Scrapper

import sys
for index, path in enumerate(sys.path):
    print(f'{index:02}: {path}')

Returns:'
00: C:\Users\username\Python\Scrapper\library\firefox\path
01: C:\Users\username\Python\Scrapper
02: C:\Users\username\AppData\Local\Programs\Python\Python312\python312.zip
03: C:\Users\username\AppData\Local\Programs\Python\Python312\DLLs
04: C:\Users\username\AppData\Local\Programs\Python\Python312\Lib
05: C:\Users\username\AppData\Local\Programs\Python\Python312
06: C:\Users\username\Python\Scrapper\venv
07: C:\Users\username\Python\Scrapper\venv\Lib\site-packages
08: C:\Users\username\AppData\Local\Programs\Python\Python312\Lib\site-packages
09: C:\Users\username\Python\*********\********
10: C:\Users\username\AppData\Local\Programs\Python\Python312\Lib\site-packages\win32
11: C:\Users\username\AppData\Local\Programs\Python\Python312\Lib\site-packages\win32\lib
12: C:\Users\username\AppData\Local\Programs\Python\Python312\Lib\site-packages\Pythonwin
'

以下函数将返回项目的根路径。

def abs_path(path: str = ''):
    from sys import path as syspath
    from os import sep

    if len(path):
        path = path.replace('/', sep)
        if not path.startswith(sep):
            path = sep + path

    for _ in syspath[1:]:
        if _ in syspath[0]:
            return _ + path

    return syspath[0] + path


print(__file__)
print(abs_path())
print(abs_path(r'config\urls.txt'))

Returns:'
C:\Users\username\Python\Scrapper\library\firefox\path\path.py
C:\Users\username\Python\Scrapper
C:\Users\username\Python\Scrapper\config\urls.txt
'
© www.soinside.com 2019 - 2024. All rights reserved.