我的应用程序的文件夹结构如下:
rootfolder
/subfolder1/
/subfolder2
/subfolder3/test.py
我的代码位于子文件夹3中。但我想将代码的输出写入
subfolder1
。
script_dir = os.path.dirname(__file__)
full_path = os.path.join(script_dir,'/subfolder1/')
我想知道如何在不导入目录完整路径的情况下执行此操作。
听起来你想要类似的东西
project_root = os.path.dirname(os.path.dirname(__file__))
output_path = os.path.join(project_root, 'subfolder1')
project_root
设置为脚本的父文件夹above,与您的描述相匹配。然后输出文件夹转到该文件夹下的 subfolder1
。
我还将我的导入改写为
from os.path import dirname, join
这会将您的代码缩短为
project_root = dirname(dirname(__file__))
output_path = join(project_root, 'subfolder1')
我发现这个版本更容易阅读。
sys.path
返回项目的所有相关路径。
sys.path
的第一项是正在执行的文件的路径。第二个条目是ether项目的根路径,或者与python本身相关的路径,'IF'正在执行的文件在项目的根路径中。
import sys
for index, path in enumerate(sys.path):
print(f'{index:02}: {path}')
Returns:'
00: C:\Users\username\Python\Scrapper\library
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\phpjunkie\phpjunkie
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
from os import sep
if len(_path):
_path = _path.replace('/', sep)
if not _path.startswith(sep):
_path = sep + _path
if path[1] in path[0]:
return path[1] + _path
else:
return path[0] + _path
print(__file__)
print(abs_path())
print(abs_path(r'config\urls.txt'))
Returns:'
C:\Users\phpjunkie\Python\Scrapper\folder\folder\folder\path.py
C:\Users\phpjunkie\Python\Scrapper
C:\Users\phpjunkie\Python\Scrapper\config\urls.txt
'
完成此任务的最佳方法是将您的项目变成一个模块。 Python 使用
__init__.py
文件来识别此设置。 所以我们可以简单地在根目录创建一个空的__init__.py
文件。 结构如下:
rootfolder
/subfolder1/
/subfolder2
/subfolder3/test.py
__init__.py
完成后,您可以引用任何子文件夹,如下所示:
subfolder1/output.txt
因此,您的脚本将如下所示:
f = open("subfolder1/output.txt", "w+")
f.write("works!")
f.close()