我有以下工作目录:/Users/jordan/Coding/Employer/code_base
,而我要获取其绝对路径的文件位于/Users/jordan/Coding/Employer/code_base/framework/GTC/tests/day_document.json
。
我在文件/Users/jordan/Coding/Employer/code_base/framework/GTC/tests/test.py
中进行了测试。
当前,当我使用os.path.join(os.getcwd(), os.path.relpath('day_document.json')
时,我会得到/Users/jordan/Coding/Employer/code_base/day_document.json
。我想获取到day_document.json
的正确文件路径,以便测试可以在CI中正常工作。该代码当前正在测试文件/Users/jordan/Coding/Employer/code_base/framework/GTC/tests/test.py
中运行。
我已经在os.path.relpath('day_document.json')
中尝试过os.path.abspath('day_document.json')
和os.join
,并且都返回了/Users/jordan/Coding/Employer/code_base/day_document.json
。我也进行了大量的谷歌搜索,但似乎找不到任何能找到正确答案的地方。使用os.path.join(os.getcwd(), 'framework/GTC/tests/day_document.json')
时,我得到了正确的行为,但是我不想对文件路径进行硬编码。
这有效:
day_document_file_location = os.path.join(os.getcwd(), 'framework/GTC/tests/day_document.json')
with open(day_document_file_location, 'r') as day_doc_json:
day_doc_endpoint._content = day_doc_json.read()
但是我不明白为什么不这样做
day_document_file_location = os.path.join(os.getcwd(), os.path.relpath('day_document.json'))
with open(day_document_file_location, 'r') as day_doc_json:
day_doc_endpoint._content = day_doc_json.read()
我不得不提到,当我从文件位置而不是工作目录运行时,后者的代码有效。
我想找到一种不对文件路径进行硬编码的方法,并且能够从工作目录中获取/Users/jordan/Coding/Employer/code_base/framework/GTC/tests/day_document.json
。
答案 0 :(得分:2)
根据[Python 3.Docs]: os.path.relpath(path, start=os.curdir)(强调是我的):
...这是路径计算:文件系统无法访问以确认 path 或 start 的存在或性质。< / p>
如果您不想对 framework / GTC / tests / day_document.json (中间目录)进行硬编码,则需要搜索该文件。一种方法是使用[Python 3.Docs]: glob.iglob(pathname, *, recursive=False):
document_name = "day_document.json"
document_path = ""
for p in glob.iglob(os.path.join("**", document_name), recursive=True):
document_path = os.path.abspath(p)
break
if not document_path:
# Handle file not being present, e.g.:
raise FileNotFoundError(document_name)
不用说,如果您在目录树中有多个具有该名称的文件,则将返回1 st 一个文件(并且不能保证它是您所需要的文件)期待)。