我在jupyter笔记本中加载一个文件有困难。
这是我的项目树:
--家庭
- my_main.py
-笔记本
- my_notebook.ipynb
- dns
-资产
- stopwords.txt
- my_module.py
要知道'/home/cdsw/“在我的PYTHONPATH中- -我在这个解释器中启动jupyter -。
在my_module.py中,我有以下几行:
PATH_STOPWORDS: Final = os.path.join("dns", "assets", "stopwords.txt")
STOPWORDS: Final = load_stopwords(PATH_STOPWORDS)load_stopwords基本上只是一个打开(PATH_STOPWORDS,'r')。因此,我的问题是,当我在dns.bilans.my_module中导入my_main.py时,它工作得很好:文件被正确加载。然而,当我从my_notebook.ipynb导入它时,它没有:
FileNotFoundError: [Errno 2] No such file or directory: 'dns/assets/stopwords.txt'因此,my_module确实是由jupyter内核创建的(因为它读取文件的代码行),但不能像在终端中运行时那样使用提供的相对路径。
当我在模块中使用一个打开(relpath,'r')时,我不需要遍历整个项目树,对吗?事实上,它在my_main.py中确实有效..。
我真的不明白..。
jupyter中os.getcwd()的输出是“/home/cdsw/记事本”。
发布于 2022-02-13 17:59:47
这个existing SO question建议如何找到相对于Python代码文件位置的文件。然而,这不是一个完全相同的问题,我相信,对于每个Python程序员来说,这种技术是如此重要,因此我将提供一个更彻底的答案。
给定一段Python代码,可以通过以下方法计算包含该代码的源文件目录的路径:
here = os.path.dirname(__file__)有了相关源文件的位置,就很容易计算到相对于该源文件具有已知位置的任何数据文件的绝对路径。在这种情况下,这样做的方法是:
stopwords_path = os.path.join(here, '..', '..', 'assets', 'stopwords.txt')此路径可以提供给open(),也可以以任何其他方式引用stopwords.txt数据文件。在这里,使用此路径的方法是:
load_stopwords(stopwords_path)我使用这种技术不仅可以在特定模块中查找伴随代码的文件,而且还可以在整个源代码树中查找位于其他位置的文件。只要代码和数据文件存在于同一个源存储库中,或者是在一个Python包中一起提供,相对路径就不会随着安装而改变,因此这种技术将起作用。
通常,您应该避免使用相对路径。只要有可能,您也应该避免告诉代码在哪里找到东西。对于任何情况,问问自己如何获得一个可靠的绝对路径,然后您可以使用它来定位您想要访问的任何东西。
https://stackoverflow.com/questions/71102851
复制相似问题