Python在脚本中查找文件的位置?
我刚写了一个标题屏幕的类,运行得不错。不过,我的一个项目伙伴提到我不应该使用:
os.chdir(os.getcwd() + "/..")
resource = (os.getcwd() + "/media/file name")
来访问上级目录。他提到了一些关于pythonpath的事情。我们现在在用Eclipse,如果这有帮助的话。
为了让你们更了解我们的情况,我们正在制作一个多平台的游戏,所以不能简单地同步我们的目录并硬编码(虽然我们在用git,所以工作目录是同步的)。简单来说,我需要一种方法,从一个在“src”文件夹里的脚本文件,访问旁边的“media”文件夹(也就是说,有一个上级(项目)文件夹,里面有“src”和“media”两个文件夹)。
如果能帮忙我会非常感激,但请不要说“去谷歌一下”,因为我在来这里之前已经试过了(我不知道这是不是这里常见的情况,但我在其他地方看到太多次了...当我在谷歌上找答案时,抱歉如果我说得让人觉得不爽)
3 个回答
可以考虑使用 os.path.dirname()
和 os.path.join()
这两个函数。这两个函数在不同的操作系统上都能正常工作,不会受平台限制。
我推荐使用类似下面的代码:
import os.path
base_folder = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
media_folder = os.path.join(base_folder, "media")
src_folder = os.path.join(base_folder, "src")
resource = os.path.join(media_folder, "filename")
for path in [base_folder, media_folder, src_folder, resource]:
print path
主要的组成部分有:
__file__
:这个可以获取当前源文件的路径(和sys.argv[0]
不同,后者是获取被调用脚本的路径)os.path.split()
:这个函数可以把一个路径分成相对的文件/文件夹名称和包含它的基本文件夹。像base_folder = ...
这样使用两次,就能得到父目录。os.path.join
:这个函数可以正确地组合路径名称,不受操作系统的影响。它能处理缺失的或者多个/
或\
的情况。
Python程序有一个叫做当前工作目录的概念,这通常是指运行脚本时所在的文件夹。也就是说,程序会在这个目录下寻找相对路径的文件。
不过,由于你的程序可以从不同的文件夹运行,所以你需要参考的是脚本所在的文件夹(一般来说,当前目录和脚本的位置没有直接关系)。要获取脚本所在的目录,可以使用
script_dir = os.path.dirname(__file__)
需要注意的是,这个路径可以是相对路径(可能是空的),所以确保脚本的当前工作目录和脚本被Python解释器读取时的目录是一样的很重要(这时__file__
才会被设置)。如果后面的代码改变了当前工作目录,就需要把可能是相对的script_dir
转换成绝对路径:
# If script_dir is relative, the current working directory is used, here. This is correct if the current
# working directory is the same as when the script was read by the Python interpreter (which is
# when __file__ was set):
script_dir = os.path.abspath(script_dir)
这样你就可以通过平台无关的方式访问上级目录中的media
文件夹了。
os.path.join(script_dir, os.path.pardir, 'media')
实际上,os.path.pardir
(或者os.pardir
)是一个平台无关的上级目录的表示方法,而os.path.join()
则是以平台无关的方式连接路径。