本地相对文件名在Python中意味着什么?

时间:2016-02-05 18:27:28

标签: python relative-path

我发现,要执行文件名给出的文件我需要做

import os
dir = os.path.dirname(__file__)
filename = os.path.join(dir, '/relative/path/to/file/you/want')

import os
dir = os.getcwd()
filename = os.path.join(dir, '/relative/path/to/file/you/want')

但如果我这样做

filename = 'myfile.txt'

那么它将在哪里找到这个文件?

2 个答案:

答案 0 :(得分:0)

当前工作目录中的

简答:

答案很长:

来自https://docs.python.org/2/library/stdtypes.html#bltin-file-objects

  

使用C的stdio包

实现文件对象

来自https://docs.python.org/2/library/functions.html#open

  

前两个参数与stdio的fopen()相同:name是要打开的文件名

因此,通过查看stdio的文档来解答这个问题:

来自http://www.cplusplus.com/reference/cstdio/fopen/

  

filename

     

包含要打开的文件名的C字符串。

     

其值应遵循运行环境的文件名规范,并且可以包含路径(如果系统支持)。

“运行环境的规范”意味着它会将其解释为您输入了运行该文件的路径,即cwd。

例如,如果我的脚本位于~/Desktop/temp.py,则说明:

f = open("log.txt", 'r')
print "success opening"
f.close()

我的文件位于~/Desktop/log.txt,我得到以下输出:

~/Desktop $ python temp.py
success opening

但如果我cd ..再试一次:

~ $ python ~/Desktop/temp.py
Traceback (most recent call last):
  File "/home/whrrgarbl/Desktop/temp.py", line 1, in <module>
    f = open("log.txt", 'r')
IOError: [Errno 2] No such file or directory: 'log.txt'

只是为了验证:

~ $ touch log.txt
~ $ python ~/Desktop/temp.py
success opening

所以你可以看到它试图打开它相对于我运行脚本的目录,而不是脚本所在的目录。

答案 1 :(得分:0)

创建一个简单的python脚本(open.py)并使用strace运行它。

剧本:

#!/usr/bin/env python

with open('myfile.txt', 'r') as fd:
    pass

Strace命令:strace ./open.py

这显示了我(仅显示相关部分):

read(3, "#!/usr/bin/env python\n\nwith  ope"..., 4096) = 70
read(3, "", 4096)                       = 0
brk(0x23a2000)                          = 0x23a2000
close(3)                                = 0
munmap(0x7f7f97dc3000, 4096)            = 0
open("myfile.txt", O_RDONLY)            = -1 ENOENT (No such file or directory)
write(2, "Traceback (most recent call last"..., 35Traceback (most recent call last):
) = 35
write(2, "  File \"./open.py\", line 3, in <"..., 40  File "./open.py", line 3, in <module>
) = 40

查看open系统调用得到了python脚本中提供的路径。 open将尝试在当前工作目录中打开该文件,该目录是运行程序的地方。