You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Python3使用json.load()无法读取同目录JSON文件的问题求助

问题分析与解决方案

你遇到的核心问题是Python解析相对路径时,参考的是你运行脚本时的「当前工作目录」,而不是脚本文件本身所在的目录

当你在project文件夹的上层目录执行python3 project/model.py时,你的当前工作目录是project的父文件夹,代码里的"agents-100k.json"会尝试在这个父文件夹里查找,自然找不到实际存放在project文件夹里的文件。

这里有几个靠谱的解决办法:

方法1:切换到脚本所在目录后运行

最简单的方式是先进入project文件夹,再执行脚本:

cd project
python3 model.py

这样当前工作目录和脚本、JSON文件所在目录一致,相对路径就能正确解析。

方法2:在代码中使用脚本目录的绝对路径(推荐)

如果你希望不管从哪个目录都能正常运行脚本,可以通过代码动态获取脚本所在的目录,再拼接JSON文件的完整路径。修改你的model.py代码如下:

import json
import os  # 新增导入os模块

class Agent:
    def __init__(self, **agent_attributes):
        """Constructor of Agent class"""
        print(agent_attributes.items())
        for attr_name, attr_value in agent_attributes.items():
            setattr(self, attr_name, attr_value)

    def say_hello(self, first_name):
        """Say hello to name given in argument"""
        return "Hello " + first_name + "!"

def main():
    # 获取当前脚本的绝对路径
    script_path = os.path.abspath(__file__)
    # 获取脚本所在的目录
    script_dir = os.path.dirname(script_path)
    # 拼接JSON文件的完整路径
    json_file_path = os.path.join(script_dir, "agents-100k.json")
    
    with open(json_file_path, 'r') as f:  # 改用with语句更安全,自动关闭文件
        for agent_attributes in json.load(f):
            agent = Agent(**agent_attributes)
            print(agent.agreeableness)

main()

代码说明:

  • os.path.abspath(__file__):获取当前model.py文件的绝对路径
  • os.path.dirname(script_path):从绝对路径中提取出文件所在的目录(也就是project文件夹)
  • os.path.join():安全地拼接目录和文件名,避免手动拼接路径时出现的跨平台问题(比如Windows用\,Linux用/
  • 改用with open(...)语句:相比直接open(),它会在代码块结束后自动关闭文件,更符合Python的最佳实践。

方法3:直接使用绝对路径(不推荐)

你也可以直接把JSON文件的完整绝对路径写在代码里,比如:

json.load(open("/home/xxx/project/agents-100k.json"))

但这种方式不够灵活,一旦你移动了项目文件夹或者换了电脑,就需要手动修改路径,所以不推荐使用。


内容的提问来源于stack exchange,提问作者Bravo2bad

火山引擎 最新活动