我的文件夹结构如下所示:
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
您可以使用
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
在@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')
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
'