从项目根目录获取文件路径。

huangapple go评论100阅读模式
英文:

How can I get a file path from project root

问题

这是我的完整文件路径
/Users/UserName/project/first_level/second/somename/my_file.py

我导入该文件,然后想要获取它相对于项目的路径(对于我来说,根目录是 project

我需要获取 first_level/second/somename/my_file.py
当我执行 my_file.__file__ 时,我得到完整路径

有人可以帮忙吗?

英文:

This is my full file path
/Users/UserName/project/first_level/second/somename/my_file.py

I import the file and then want to get it path from relative to project(for me the root is project)

I need to get the first_level/second/somename/my_file.py
When I do my_file.__file__ I get the full path

Can someone help?

答案1

得分: 1

可以使用 os.path.relpath

假设你有以下目录结构:

  1. project
  2. main.py
  3. |
  4. └───first_level
  5. | |____second_level
  6. | | my_file.py
  7. | ...

如果你运行 main.py:

  1. import os
  2. from pathlib import Path
  3. import first_level.second_level.my_file
  4. # 将会打印从 main.py 到 my_file.py 文件的相对路径
  5. print(os.path.relpath(my_file.__file__, Path(__file__).parent))

如果你想从另一个文件获取到项目根目录的相对路径,你需要在某处设置 ROOT_DIR,然后运行 print(os.path.relpath(my_file.__file__, ROOT_DIR))

(在 Django 中的 settings.py 中通常会设置类似于以下的 BASE_DIR

  1. BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  2. ```)
  3. <details>
  4. <summary>英文:</summary>
  5. You can use `os.path.relpath`
  6. Let&#39;s say that you have structure

project
│ main.py
|
└───fist_level
│ │
| |____second_level
| | my_file.py
| ...

  1. If you run main.py
  2. ```py
  3. import os
  4. from pathlib import Path
  5. import fist_level.second_level.my_file
  6. # will print relative path to my_file.py file from main.py
  7. print(os.path.relpath(my_file.__file__, Path(__file__).parent))

If you want to get the relative path to your root project from another file you will need to set somewhere
ROOT_DIR and then run print(os.path.relpath(my_file.__file__, ROOT_DIR))

(Very similar in Django in settings.py it usually sets

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

答案2

得分: 0

如果您确定/Users/UserName/project始终不会改变,您可以通过\拆分路径,然后从列表的第三个元素开始连接:

  1. &gt;&gt;&gt; path_to_file = &quot;/Users/UserName/project/first_level/second/somename/my_file.py&quot;
  2. &gt;&gt;&gt; (&quot;/&quot;).join(path_to_file.split(&quot;/&quot;)[3:])
  3. &#39;project/first_level/second/somename/my_file.py&#39;

如果您不知道它将位于何处,您可以在拆分的列表中查找项目,然后连接:

  1. &gt;&gt;&gt; path_split = path_to_file.split(&quot;/&quot;)
  2. &gt;&gt;&gt; (&quot;/&quot;).join(path_split[path_split.index(&quot;project&quot;)+1:])
  3. &#39;first_level/second/somename/my_file.py&#39;
英文:

If you are sure that /Users/UserName/project will be always the same you can split the path by \ and then join from the third element in the list to the end:

  1. &gt;&gt;&gt; path_to_file = &quot;/Users/UserName/project/first_level/second/somename/my_file.py&quot;
  2. &gt;&gt;&gt; (&quot;/&quot;).join(path_to_file.split(&quot;/&quot;)[3:])
  3. &#39;project/first_level/second/somename/my_file.py&#39;

If you don't know where it will be located, you can find project on the splited list and then join:

  1. &gt;&gt;&gt; path_split = path_to_file.split(&quot;/&quot;)
  2. &gt;&gt;&gt; (&quot;/&quot;).join(path_split[path_split.index(&quot;project&quot;)+1:])
  3. &#39;first_level/second/somename/my_file.py&#39;

答案3

得分: 0

From my_file.py one can use relpath().

my_file.py

  1. import os
  2. print(os.path.relpath(__file__, os.curdir))

Should give you:

  1. first_level/second/somename/my_file.py

When imported

英文:

From my_file.py one can use relpath().

my_file.py

  1. import os
  2. print(os.path.relpath(__file__, os.curdir))

Should give you :

  1. first_level/second/somename/my_file.py

When imported

huangapple
  • 本文由 发表于 2023年6月5日 23:10:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/76407794.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定