2017-04-04 106 views
0

我发现脚本的“当前工作目录”最初不是脚本所在的位置,而是他/她运行脚本时的用户。如何处理文件路径?

如果脚本是在/Desktop/Projects/pythonProject/myscript.py,但我在我的终端/Documents/Arbitrary我,当我运行该脚本,那么这将是它的当前工作目录,并在open('data.txt')试图要给未找到文件,因为它是不在正确的目录中查找。

那么脚本应该如何打开文件,如果它不知道它从哪里运行?这是如何处理的?

我最初的想法是使用绝对路径。假设我的脚本需要打开data.txt,并将其存储在其包pythonProject中。那么我只想说open('/Desktop/Projects/pythonProject/data.txt')

但是,如果不修改其中的每条路径,就无法移动该项目,所以这不可能是正确的解决方案。

或者只是您的答案只是您必须在您运行脚本时脚本所在的目录中?这似乎也不错。

有没有一些简单的操作,这我没有想到?您是否应该在脚本的开头将os.chdir添加到脚本的位置?

+0

您可以使用'__file__'确定脚本的位置。 – smarx

+0

[我如何获取当前正在执行的文件的路径和名称?](http://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name当前正在执行的文件) – congusbongus

回答

2

import os 
file_dir = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) 

然后,要创建跨平台的文件路径,使用os.path.join()

os.path.join(file_dir, "test.txt") 

或者,你可以改变当前工作目录到正在运行的文件的目录,所以你不必os.path.join每次:

os.path.chdir(os.path.dirname(os.path.abspath(os.path.realpath(__file__)))) 

为什么使用os.path.abspathos.path.realpath?内部realpath解析符号链接,而abspath解析相对路径。如果您确定没有使用符号链接,则可以省略此内部呼叫。

+0

这是一个很好的答案,但是如果脚本接受文件的名称作为命令行参数执行操作,并且只使用这些技术来定位静态他们需要操作的文件。 – cco

+0

接受动态文件名作为命令行参数似乎不在问题范围内。 – Julien

+0

这就是为什么我加入了我的想法作为评论。这个问题似乎没有考虑接受一个文件名作为替代,事实上它是一种常见模式。对于所问的问题,你的回答是很好的答案。 – cco

1

模块的位置总是在__file__变量中可用。您可以在os.path使用的功能(我主要是想BASEDIR,并加入)使用os.path.dirnameos.path.abspathos.path.realpath__file__变量获取当前文件的目录路径,以模块相对路径转换为绝对路径