Python在脚本中查找文件的位置?

1 投票
3 回答
933 浏览
提问于 2025-04-17 17:58

我刚写了一个标题屏幕的类,运行得不错。不过,我的一个项目伙伴提到我不应该使用:

os.chdir(os.getcwd() + "/..")

resource = (os.getcwd() + "/media/file name")

来访问上级目录。他提到了一些关于pythonpath的事情。我们现在在用Eclipse,如果这有帮助的话。

为了让你们更了解我们的情况,我们正在制作一个多平台的游戏,所以不能简单地同步我们的目录并硬编码(虽然我们在用git,所以工作目录是同步的)。简单来说,我需要一种方法,从一个在“src”文件夹里的脚本文件,访问旁边的“media”文件夹(也就是说,有一个上级(项目)文件夹,里面有“src”和“media”两个文件夹)。

如果能帮忙我会非常感激,但请不要说“去谷歌一下”,因为我在来这里之前已经试过了(我不知道这是不是这里常见的情况,但我在其他地方看到太多次了...当我在谷歌上找答案时,抱歉如果我说得让人觉得不爽)

3 个回答

0

可以考虑使用 os.path.dirname()os.path.join() 这两个函数。这两个函数在不同的操作系统上都能正常工作,不会受平台限制。

1

我推荐使用类似下面的代码:

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:这个函数可以正确地组合路径名称,不受操作系统的影响。它能处理缺失的或者多个 /\ 的情况。
2

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()则是以平台无关的方式连接路径。

撰写回答