- 此问题在此处已有答案**:
open() gives FileNotFoundError / IOError: '[Errno 2] No such file or directory'(8个答案)
两个月前关门了。
截至5天前,社区正在审查是否重新讨论此问题。
假设我有一个Python项目,其结构如下:
project
/data
test.csv
/package
__init__.py
module.py
main.py
__init__.py
:
from .module import test
module.py
:
import csv
with open("..data/test.csv") as f:
test = [line for line in csv.reader(f)]
main.py
:
import package
print(package.test)
当我运行main.py
时,我得到以下错误:
C:\Users\Patrick\Desktop\project>python main.py
Traceback (most recent call last):
File "main.py", line 1, in <module>
import package
File "C:\Users\Patrick\Desktop\project\package\__init__.py", line 1, in <module>
from .module import test
File "C:\Users\Patrick\Desktop\project\package\module.py", line 3, in <module>
with open("../data/test.csv") as f:
FileNotFoundError: [Errno 2] No such file or directory: '../data/test.csv'
然而,如果我从package
目录运行module.py
,我不会得到任何错误。所以,似乎在open(...)
中使用的相对路径只是相对于原始文件正在运行的位置(即__name__ == "__main__"
)?我不想使用绝对路径。有什么方法可以处理这个问题?
6条答案
按热度按时间dgtucam11#
相对路径相对于当前工作目录。如果不希望路径是相对路径,则必须是绝对路径。
但是有一个常用的技巧可以从当前脚本构建一个绝对路径:使用其
__file__
特殊属性:这需要python 3.4+(用于pathlib模块)。
如果您仍然需要支持旧版本,可以使用以下命令获得相同的结果:
y1aodyip2#
对于Python 3.4+:
xzv2uavs3#
这对我很有效。
rseugnpd4#
我的Python版本是Python 3.5.2,在接受的答案中提出的解决方案对我不起作用。
未找到文件错误:[Errno 2]没有此类文件或目录
当我从终端运行
my_script.py
时。虽然当我通过PyCharm IDE(PyCharm 2018. 3. 2(社区版))的运行/调试配置运行它时,它工作得很好。而不是使用:
正如公认答案中所建议的,我使用了:
将
os.path.dirname(__file__)
更改为os.path.dirname(os.path.abspath(__file__))
可解决以下问题:当我们这样运行脚本时:
python3 my_script.py
__file__
变量只有一个字符串值"my_script. py",没有指向该特定脚本的路径。这就是dirname(__file__)
方法返回空字符串""的原因。这也是my_path = os.path.abspath(os.path.dirname(__file__)) + some_rel_dir_path
实际上与my_path = some_rel_dir_path
相同的原因。因此,当尝试使用open
方法时,会给出FileNotFoundError: [Errno 2] No such file or directory
,因为没有类似于"some_rel_dir_path"的目录。从PyCharm IDE运行/调试配置运行脚本是有效的,因为它运行命令
python3 /full/path/to/my_script.py
(其中"/full/path/to "由我们在运行/调试配置的"工作目录"变量中指定),而不是像我们从终端运行它时那样只运行python3 my_script.py
。c8ib6hqw5#
试试看
l7mqbcuq6#
当下面的代码工作时,我感到很惊讶。
所以,我查了文档,上面写着:
版本3.6中的变更:接受类似路径的对象。
路径类对象:
表示文件系统路径的对象。类似路径的对象可以是字符串或...
我做了一点挖掘和以下也工作: