Python os 模块使用相对路径打开当前目录上方的文件

问题描述 投票:0回答:3

操作系统模块的文档似乎没有有关如何打开不在子目录或脚本运行的当前目录中且没有完整路径的文件的信息。我的目录结构如下所示。

/home/matt/project/dir1/cgi-bin/script.py
/home/matt/project/fileIwantToOpen.txt

open("../../fileIwantToOpen.txt","r")

给出文件未找到错误。但是如果我在 cgi-bin 目录中启动一个 python 解释器并尝试

open("../../fileIwantToOpen.txt","r")
它就可以工作。出于明显的可移植性原因,我不想在完整路径中进行硬编码。 OS 模块中是否有一组 CAN 可以做到这一点的方法?

python file-io cgi cgi-bin
3个回答
53
投票

open
的路径应该相对于当前工作目录,即运行脚本的目录。因此,上面的示例仅在您从 cgi-bin 目录运行时才有效。

一个简单的解决方案是使您的路径相对于脚本。一种可能的解决方案。

from os import path

basepath = path.dirname(__file__)
filepath = path.abspath(path.join(basepath, "..", "..", "fileIwantToOpen.txt"))
f = open(filepath, "r")

通过这种方式,您将获得正在运行的脚本的路径(基本路径)并将其与要打开的文件的相对路径连接起来。

os.path
将处理连接两条路径的细节。


6
投票

这应该会将您移至脚本所在的目录(如果您尚未进入该目录):

file_path = os.path.dirname(__file__)
if file_path != "":
    os.chdir(file_path)
open("../../fileIwantToOpen.txt","r")

0
投票

这个答案确实已经过时了,Python3 有更好的文件功能。当您查找如何打开脚本上方目录中的文件时,这是第一个 Google 结果。所以这是一种更新的方法。

from pathlib import Path

Path(__file__).joinpath(Path("../../fileIwantToOpen.txt")).open(mode='r')

重要细节:

__file__ 是被调用文件的绝对路径。

.joinpath 是连接两个路径部分的 Path 方法。

Path 对象可以毫无问题地使用相对路径。

路径对象有自己的 open() 方法,因此您不需要对它们使用 open() ,除非您出于风格原因更喜欢它。

© www.soinside.com 2019 - 2024. All rights reserved.