python3 如何读取json文件,修改和写入?

python3 How to read json file, modify and write?

提问人:Pawel 提问时间:2/17/2023 更新时间:2/17/2023 访问量:31

问:

我正在尝试读取 json 文件,修改然后保存修改后的版本。 不幸的是,文件的内容没有被保存,而是在原始文件的末尾添加了另一个 json。

我的代码:

with open(os.environ.get("WORKSPACE")+"/test.json", 'r+') as test_file:
    test = json.load(test_file)
    test['COMPONENTS'] = "test components"
    json.dump(test, test_file)

test.json{"STAGE": "Test", "DATE": "2023-02-17", "TIME": "13:27", "COMPONENTS": ""}

运行代码后{"STAGE": "Test", "DATE": "2023-02-17", "TIME": "13:27", "COMPONENTS": ""}{"STAGE": "Test", "DATE": "2023-02-17", "TIME": "13:27", "COMPONENTS": "test components"}

预期成果:{"STAGE": "Test", "DATE": "2023-02-17", "TIME": "13:27", "COMPONENTS": "test components"}

请指出我做错了什么

我的环境 Python 3.10.9 中文文档 macOS 12.3.1 版本

我尝试使用 w+

Exception has occurred: JSONDecodeError
Expecting value: line 1 column 1 (char 0)
StopIteration: 0

During handling of the above exception, another exception occurred:

  File "/test.py", line 20, in <module>
    test = json.load(test_file)
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
python json

评论


答:

1赞 UpmostScarab 2/17/2023 #1

我认为问题在于在您的打开模式中添加 a。另请注意,这会截断文件,因此不会有 JSON 要读取。我认为你应该做的是:+w+

with open(os.environ.get("WORKSPACE")+"/test.json", 'r') as test_file:
    test = json.load(test_file)
    test['COMPONENTS'] = "test components"

with open(os.environ.get("WORKSPACE")+"/test.json", 'w') as test_file:
    json.dump(test, test_file)

评论

0赞 Pawel 2/17/2023
当您将“with”语句用于文件操作时,终止会自动关闭该文件。您的代码不起作用。
0赞 UpmostScarab 2/17/2023
@Pawel我不确定问题是什么,我关闭了它,然后重新打开它。你试过运行它吗?你得到了什么错误?执行 json.load 后,不再对文件执行任何操作。然后在 json.dump 之前打开它
0赞 jprebys 2/18/2023
@Pawel这个解决方案将适用于您想要的。
1赞 Pawel 2/18/2023
@UpmostScarab 对不起,我错了。它像你写的一样工作。我一定是在检查文件时犯了一个错误。
1赞 jprebys 2/17/2023 #2

就像 UpmostScarab 所说的那样,最简单的方法是打开文件两次。如果出于某种原因只想打开一次,可以先读,再读,再写,最后:seek(0)truncate

with open(os.environ.get("WORKSPACE")+"/test.json", 'r+') as test_file:
    test = json.load(test_file)
    test['COMPONENTS'] = "test components"
    test_file.seek(0)
    json.dump(test, test_file)
    test_file.truncate()

评论

0赞 Pawel 2/17/2023
非常感谢,效果很好。我正在学习python,不知道seek()方法。
0赞 jprebys 2/18/2023
如果您的问题已得到解答,您能否将答案标记为已接受?