Nicest way to find current directory of file in python
我正在找一个
1 2 3
| import os
package_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(package_dir,'foo.csv') |
我的工作路径不是文件的路径。因此,当我想要加载一个文件时,我需要一种方法来生成与我的工作目录相比的相对路径。
我想更新到pathlib(或者其他的)。但最好的方法是什么呢?
我找到了https://stackoverflow.com/a/44188489,但我认为这个解决方案看起来并不比我目前的方式好。
备注:
它不是如何正确确定当前脚本目录的副本?因为我明确地问过最好的方法。另一篇文章中的大多数解决方案都不好看,或者已经在"我的问题"中提到过。解决方案
1
| Path(__file__).with_name("foo.csv") |
这里给出的答案比另一个问题给出的答案要好得多,因为它很容易理解,而且是一种真正的Python式的解决方法。如果这个问题是一个可疑的,在另一个帖子上同样会有一个很好的答案。
- 你的第一行对我来说很好。我想你不需要它的os.path.abspath部分。至于pathlib,一旦你有了一条路径,它就会发挥作用。这只是处理文件路径的一种更聪明的方法。因此,它使第二行更容易编写,但实际上对第一行没有太大作用。
- 你为什么要改变?您当前的解决方案有哪些不足之处?
- 操作系统的当前版本。是相对古老的。Pathlib被发明来取代大多数操作系统。功能。这就是为什么我在寻找一种新的方法来使用Pathlib。也许甚至还有比当前解决方案更舒适的解决方案。
如果您希望对pathlib执行相同的操作,它可能如下所示:
1 2 3 4
| from pathlib import Path
package_dir = Path(__file__).parent.absolute()
file_path = package_dir.joinpath("foo.csv") |
除非您正在更改当前的工作目录,否则您可能不需要/不想使用.absolute()。
如果你实际上不需要知道package_dir是什么,你也可以直接得到file_path:
1
| file_path = Path(__file__).with_name("foo.csv").absolute() |
这会给你新的Path替换文件名。
- 太棒了:)这个解决方案看起来很干净,很容易理解。
- 我得承认,我真的很喜欢pathlib,我认为它确实允许彻底清理整个文件处理。
- 您的单行解决方案和子文件夹有问题。我用这个来代替:Path(__file__).parent.joinpath("output/foo.csv")。
- @Subjord你能不能对问题的本质更具体一点?我们可以尝试找到解决方案和/或相应地改进答案。
- 我尝试使用路径(file).with_name("../folder/foo.csv"),这会导致错误消息。
- 错误消息是什么?.with_name()似乎不是游戏后期出现的任何东西。由于没有定义,__file__不能在交互式Python会话中工作。因此,我很好奇是否还有其他的陷阱没有被提及/记录下来。
- 如果在.with_name("")括号中的字符串中包含反斜杠,我会得到以下错误消息:raise ValueError("Invalid name %r" % (name))。
- 我指的是方便的一线解决方案file_path = Path(__file__).with_name("foo.csv")。
- 我懂了。是的,with_name()用不同的文件名替换了名称部分,即相同的路径。因此,如果传递的name实际上不仅仅是路径名,而是包含目录位的(相对)路径,则不能使用此方法。也就是说,对于WindowPath使用\ ,对于PosixPath使用/。