我发现,要执行文件名给出的文件我需要做
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'
那么它将在哪里找到这个文件?
答案 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
将尝试在当前工作目录中打开该文件,该目录是运行程序的地方。